欢迎来到天天文库
浏览记录
ID:42855290
大小:76.50 KB
页数:8页
时间:2019-09-22
《设计模式:利用C#的Delegate来改进Observer模式》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Observer模式简介为了让更多的人能够看明白本文,所以在此之前,我们先来了解一下Observer模式的基木概念。模式名称:Observer结构图:意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。适用性:当一个抽象模型有两个方面,其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变。当一个对象必须通知其它对象,而它又不能假定其它对彖是谁。换言Z,你
2、不希望这些对象是紧密耦合的。应用实例在编写多层应用程序时,我们通常将表示层和数据逻辑层分隔开,比如很常见的View/Document结构,这种设计方式的好处带来的结果通常是使用多视图同时表示单一数据源,比如一个Web网站可以方便的同时拥有针对电脑的lltml页而和针对手机的WAP页而。使用这种结构时,为了保持数据显示的一致性,必须要求数据源在数据发生改变时能及时的逐一通知毎一个和它绑定的表示层进行更新。但是问题在于数据层木身并不知道到底有多少个不同的表示层正在反映着它的数据内容。因此需要设计一套有效的机制来完成这个
3、目标。模式实现我们先看看来自《设计模式迷你手册》的常规的C#实现代码。Subject(抽象目标):目标知道它的观察者。可以有任意多个观察者观察同一个目标。〃实现代码classSubject{//由于不知道有多少个观察者,所以建立了一个观察者链表privateArrayListlist=newArrayList();privatestringstrlmportantSubjectData二al〃;publicstringImportantSubjectData{get{returnstrImportantSubjec
4、tData;}set{strlmportantSubjectData二value;}}publicvoidAttach(Observero){list.Add(o);o.ObservedSubject二this;}publicvoidDetach(Observero){}publicvoidNotifyO{〃在数据发生改变后遍历列表通知观察者foreach(Observeroinlist){o.Update();}}}Observer(抽象观察者):为那些在目标发牛改变时需要获得通知的对象定义一个更新接口。abst
5、ractclassObserver〃内置一个需要观察的对象protectedSubjects;publicSubjectObservedSubject{get{returns;}set{s=value;}}abstractpublicvoidUpdate();}ConcreteSubject(实体目标,在这里相当于数据逻辑层):将有关状态存入各ConcreteSubject对象。当它的状态发生改变时,向它的各个观察者发出通知。〃在这里基本上什么都没有做,数据的获取可以放到GetState()里面classConcr
6、eteSubject:Subject{publicvoidGetState(){}publicvoidSetState(){}}ConcreteObserver(实体观察者,在这里就相当于表示层):维护一个指向ConcreteSubject的引用。储存有关状态,这些状态应与目标的状态保持一致。实现Observer的更新接口以使自身状态与目标状态保持一致。classConcreteObserver:Observer{privatestringobserverName;publicConereteObserver(st
7、ringname)observerName=name;}overridepublicvoidUpdate()//将数据显示出来Console.WriteLine(〃InObserver{0}:datafromsubject={1}〃,observerName,s.ImportantSubjectData);}}主函数:publicclassClient{publicstaticintMQir^string[]args){ConoreteSubjects=newConoreteSubject();ConcreteOb
8、serverol=newConcreteObserver(z/firstobserver'');ConcreteObservero2二newConcreteObserver(''secondobserver");//注册观察者s.Attach(ol);s.Attach(o2);s.ImportantSubjectData="Thisisimportantsu
此文档下载收益归作者所有