23个设计模式C代码第18章观察者模式OberverPattern

上传人:鲁** 文档编号:486801757 上传时间:2023-06-05 格式:DOC 页数:35 大小:735.50KB
返回 下载 相关 举报
23个设计模式C代码第18章观察者模式OberverPattern_第1页
第1页 / 共35页
23个设计模式C代码第18章观察者模式OberverPattern_第2页
第2页 / 共35页
23个设计模式C代码第18章观察者模式OberverPattern_第3页
第3页 / 共35页
23个设计模式C代码第18章观察者模式OberverPattern_第4页
第4页 / 共35页
23个设计模式C代码第18章观察者模式OberverPattern_第5页
第5页 / 共35页
点击查看更多>>
资源描述

《23个设计模式C代码第18章观察者模式OberverPattern》由会员分享,可在线阅读,更多相关《23个设计模式C代码第18章观察者模式OberverPattern(35页珍藏版)》请在金锄头文库上搜索。

1、 WORD格式分享 .NET设计模式(19):观察者模式(Observer Pattern) 概述在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系” 一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化。使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合。意图定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。GOF 设计模式结构图图1 Observer模式结构图生活中的例子观察者定义了对象间一对多的关系,

2、当一个对象的状态变化时,所有依赖它的对象都得到通知并且自动地更新。拍卖演示了这种模式。每个投标人都有一个标有数字的牌子用于出价。拍卖师开始拍卖时,他观察是否有牌子举起出价。每次接受一个新的出价都改变了拍卖的当前价格,并且广播给所有的投标人进行新的出价。图2 使用拍卖例子的观察者模式Observer模式解说下面通过一个例子来说明Observer模式。监控某一个公司的股票价格变化,可以有多种方式,通知的对象可以是投资者,或者是发送到移动设备,还有电子邮件等。一开始我们先不考虑Observer模式,通过一步步地重构,最终重构为Observer模式。现在有这样两个类:Microsoft和Investo

3、r,如下图所示:图3 UML静态图示例它们的实现如下:publicclassMicrosoftprivateInvestor_investor;privateString_symbol;privatedouble_price;publicvoidUpdate()_investor.SendData(this);publicInvestorInvestorgetreturn_investor;set_investor=value;publicStringSymbolgetreturn_symbol;set_symbol=value;publicdoublePricegetreturn_price

4、;set_price=value;publicclassInvestorprivatestring_name;publicInvestor(stringname)this._name=name;publicvoidSendData(Microsoftms)Console.WriteLine(Notified0of1s+changeto2:C,_name,ms.Symbol,ms.Price);简单的客户端实现:classProgramstaticvoidMain(stringargs)Investorinvestor=newInvestor(Jom);Microsoftms=newMicros

5、oft();ms.Investor=investor;ms.Symbol=Microsoft;ms.Price=120.00;ms.Update();Console.ReadLine();运行后结果如下:Notified Jom of Microsofts change to ¥120可以看到,这段代码运行并没有问题,也确实实现了我们最初的设想的功能,把Microsoft的股票价格变化通知到了Jom投资者那儿。但是这里面出现了如下几个问题:1Microsoft和Investor之间形成了一种双向的依赖关系,即Microsoft调用了Investor的方法,而Investor调用了Microso

6、ft类的属性。如果有其中一个类变化,有可能会引起另一个的变化。2当出现一种的通知对象,比如说是移动设备Mobile:publicclassMobileprivatestring_no;publicMobile(stringNo)this._no=No;publicvoidSendData(Microsoftms)Console.WriteLine(Notified0of1s+changeto2:C,_no,ms.Symbol,ms.Price);这时候对应的Microsoft的类就应该改变为如下代码,在Microsot类中增加Mobile,同时修改Update()方法使其可以通知到移动设备:p

7、ublicclassMicrosoftprivateInvestor_investor;privateMobile_mobile;privateString_symbol;privatedouble_price;publicvoidUpdate()_investor.SendData(this);_mobile.SendData(this);publicMobileMobilegetreturn_mobile;set_mobile=value;publicInvestorInvestorgetreturn_investor;set_investor=value;publicStringSymb

8、olgetreturn_symbol;set_symbol=value;publicdoublePricegetreturn_price;set_price=value;显然这样的设计极大的违背了“开放-封闭”原则,这不是我们所想要的,仅仅是新增加了一种通知对象,就需要对原有的Microsoft类进行修改,这样的设计是很糟糕的。对此做进一步的抽象,既然出现了多个通知对象,我们就为这些对象之间抽象出一个接口,用它来取消Microsoft和具体的通知对象之间依赖。图4 静态UML图示例实现代码如下:publicinterfaceIObservervoidSendData(Microsoftms);

9、publicclassInvestor:IObserverprivatestring_name;publicInvestor(stringname)this._name=name;publicvoidSendData(Microsoftms)Console.WriteLine(Notified0of1s+changeto2:C,_name,ms.Symbol,ms.Price);publicclassMicrosoftprivateIObserver_investor;privateString_symbol;privatedouble_price;publicvoidUpdate()_inv

10、estor.SendData(this);publicStringSymbolgetreturn_symbol;set_symbol=value;publicdoublePricegetreturn_price;set_price=value;publicIObserverInvestorgetreturn_investor;set_investor=value;做到这一步,可以看到,我们在降低两者的依赖性上已经迈进了一小步,正在朝着弱依赖性这个方向变化。在Microsoft类中已经不再依赖于具体的Investor,而是依赖于接口IObserver。但同时我们看到,再新出现一个移动设备这样的通知对象,Microsoft类仍然需要改变,对此我们再做如下重构,在Microsoft中维护一个IObserver列表,同时提供相应的维护方法。图5 静态UML示例图Microsoft类的实现代码如下:publicclassMicrosoftprivateListobservers=newList();privateString_symbol;privatedouble_price;publicvoidUpdate()foreach(IObserverobinobservers)ob.SendData(this);publicvoidAddObserver(IOb

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号