预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共12页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

概述 在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化。使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合。 意图 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。[GOF《设计模式》] 结构图 图1Observer模式结构图 生活中的例子 观察者定义了对象间一对多的关系,当一个对象的状态变化时,所有依赖它的对象都得到通知并且自动地更新。拍卖演示了这种模式。每个投标人都有一个标有数字的牌子用于出价。拍卖师开始拍卖时,他观察是否有牌子举起出价。每次接受一个新的出价都改变了拍卖的当前价格,并且广播给所有的投标人进行新的出价。 图2使用拍卖例子的观察者模式 Observer模式解说 下面通过一个例子来说明Observer模式。监控某一个公司的股票价格变化,可以有多种方式,通知的对象可以是投资者,或者是发送到移动设备,还有电子邮件等。一开始我们先不考虑Observer模式,通过一步步地重构,最终重构为Observer模式。现在有这样两个类:Microsoft和Investor,如下图所示: 图3UML静态图示例 它们的实现如下: publicclassMicrosoft{privateInvestor_investor;privateString_symbol;privatedouble_price;publicvoidUpdate(){_investor.SendData(this);}publicInvestorInvestor{get{return_investor;}set{_investor=value;}}publicStringSymbol{get{return_symbol;}set{_symbol=value;}}publicdoublePrice{get{return_price;}set{_price=value;}}publicclassInvestor{privatestring_name;publicInvestor(stringname){this._name=name;}publicvoidSendData(Microsoftms){Console.WriteLine("Notified{0}of{1}'s"+"changeto{2:C}",_name,ms.Symbol,ms.Price);}} 简单的客户端实现: classProgram{staticvoidMain(string[]args){Investorinvestor=newInvestor("Jom");Microsoftms=newMicrosoft();ms.Investor=investor;ms.Symbol="Microsoft";ms.Price=120.00;ms.Update();Console.ReadLine();}} 运行后结果如下: NotifiedJomofMicrosoft'schangeto¥120 可以看到,这段代码运行并没有问题,也确实实现了我们最初的设想的功能,把Microsoft的股票价格变化通知到了Jom投资者那儿。但是这里面出现了如下几个问题: 1.Microsoft和Investor之间形成了一种双向的依赖关系,即Microsoft调用了Investor的方法,而Investor调用了Microsoft类的属性。如果有其中一个类变化,有可能会引起另一个的变化。 2.当出现一种的通知对象,比如说是移动设备Mobile: publicclassMobile{privatestring_no;publicMobile(stringNo){this._no=No;}publicvoidSendData(Microsoftms){Console.WriteLine("Notified{0}of{1}'s"+"changeto{2:C}",_no,ms.Symbol,ms.Price);}} 这时候对应的Microsoft的类就应该改变为如下代码,在Microsot类中增加Mobile,同时修改Update()方法使其可以通知到移动设备: publicclassMicrosoft{privateInvestor_investor;privateMobile_mobile;privateString_symbol;privatedouble_price;publicvoidUpdate(){_investor.SendData(this);_mobile.S