设计模式:利用C的Delegate来改进Observer模式

设计模式:利用C的Delegate来改进Observer模式

ID:38527778

大小:62.00 KB

页数:9页

时间:2019-06-14

设计模式:利用C的Delegate来改进Observer模式_第1页
设计模式:利用C的Delegate来改进Observer模式_第2页
设计模式:利用C的Delegate来改进Observer模式_第3页
设计模式:利用C的Delegate来改进Observer模式_第4页
设计模式:利用C的Delegate来改进Observer模式_第5页
资源描述:

《设计模式:利用C的Delegate来改进Observer模式》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、专栏作品设计模式:利用C#的Delegate来改进Observer模式卢彦Observer模式简介为了让更多的人能够看明白本文,所以在此之前,我们先来了解一下Observer模式的基本概念。模式名称:Observer结构图:意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。适用性:当一个抽象模型有两个方面,其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变。当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言

2、之,你不希望这些对象是紧密耦合的。应用实例在编写多层应用程序时,我们通常将表示层和数据逻辑层分隔开,比如很常见的View/Document结构,这种设计方式的好处带来的结果通常是使用多视图同时表示单一数据源,比如一个Web网站可以方便的同时拥有针对电脑的Html页面和针对手机的WAP页面。使用这种结构时,为了保持数据显示的一致性,必须要求数据源在数据发生改变时能及时的逐一通知每一个和它绑定的表示层进行更新。但是问题在于数据层本身并不知道到底有多少个不同的表示层正在反映着它的数据内容。因此需要设计一套有效的机制来完成这个目标。模式实现我们先看看来自《设计模式迷你手册》的常规的C#实现

3、代码。Subject(抽象目标):目标知道它的观察者。可以有任意多个观察者观察同一个目标。//实现代码classSubject{//由于不知道有多少个观察者,所以建立了一个观察者链表privateArrayListlist=newArrayList();privatestringstrImportantSubjectData="Initial";publicstringImportantSubjectData{get{returnstrImportantSubjectData;}set{strImportantSubjectData=value;}}publicvoidAttach

4、(Observero){list.Add(o);o.ObservedSubject=this;}publicvoidDetach(Observero){}publicvoidNotify(){//在数据发生改变后遍历列表通知观察者foreach(Observeroinlist){o.Update();}}}Observer(抽象观察者):为那些在目标发生改变时需要获得通知的对象定义一个更新接口。abstractclassObserver{//内置一个需要观察的对象protectedSubjects;publicSubjectObservedSubject{get{returns;}

5、set{s=value;}}abstractpublicvoidUpdate();}ConcreteSubject(实体目标,在这里相当于数据逻辑层):将有关状态存入各ConcreteSubject对象。当它的状态发生改变时,向它的各个观察者发出通知。//在这里基本上什么都没有做,数据的获取可以放到GetState()里面classConcreteSubject:Subject{publicvoidGetState(){}publicvoidSetState(){}}ConcreteObserver(实体观察者,在这里就相当于表示层):维护一个指向ConcreteSubject的引

6、用。储存有关状态,这些状态应与目标的状态保持一致。实现Observer的更新接口以使自身状态与目标状态保持一致。classConcreteObserver:Observer{privatestringobserverName;publicConcreteObserver(stringname){observerName=name;}overridepublicvoidUpdate(){//将数据显示出来Console.WriteLine("InObserver{0}:datafromsubject={1}",observerName,s.ImportantSubjectData);

7、}}主函数:publicclassClient{publicstaticintMain(string[]args){ConcreteSubjects=newConcreteSubject();ConcreteObservero1=newConcreteObserver("firstobserver");ConcreteObservero2=newConcreteObserver("secondobserver");//注册观察者s.Attach(o1);s.Attac

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。