- 2
- 0
- 约1.17万字
- 约 36页
- 2018-11-25 发布于安徽
- 举报
专业整理
WORD格式
HYPERLINK /Terrylee/archive/2006/10/23/Observer_Pattern.html .NET设计模式(19):观察者模式(Observer Pattern)
概述
在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系” ——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化。使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合。
意图
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。[GOF 《设计模式》]
结构图
图1 Observer模式结构图
生活中的例子
观察者定义了对象间一对多的关系,当一个对象的状态变化时,所有依赖它的对象都得到通知并且自动地更新。拍卖演示了这种模式。每个投标人都有一个标有数字的牌子用于出价。拍卖师开始拍卖时,他观察是否有牌子举起出价。每次接受一个新的出价都改变了拍卖的当前价格,并且广播给所有的投标人进行新的出价。
图2 使用拍卖例子的观察者模式
Observer模式解说
下面通过一个例子来说明Observer模式。监控某一个公司的股票价格变化,可以有多种方式,通知的对象可以是投资者,或者是发送到移动设备,还有电子邮件等。一开始我们先不考虑Observer模式,通过一步步地重构,最终重构为Observer模式。现在有这样两个类:Microsoft和Investor,如下图所示:
图3 UML静态图示例
它们的实现如下:
public?class?Microsoft{????private?Investor?_investor;????private?String?_symbol;????private?double?_price;????public?void?Update()????{????????_investor.SendData(this);????}????public?Investor?Investor????{????????get?{?return?_investor;?}????????set?{?_investor?=?value;?}????}????public?String?Symbol????{????????get?{?return?_symbol;?}????????set?{?_symbol?=?value;?}????}????public?double?Price????{????????get?{?return?_price;?}????????set?{?_price?=?value;?}????}}public?class?Investor{????private?string?_name;????public?Investor(string?name)????{????????this._name?=?name;????}????public?void?SendData(Microsoft?ms)????{????????Console.WriteLine(Notified?{0}?of?{1}s??+?change?to?{2:C},?_name,?ms.Symbol,ms.Price);????}}
简单的客户端实现:
class?Program{????static?void?Main(string[]?args)????{????????Investor?investor?=?new?Investor(Jom);????????Microsoft?ms?=?new?Microsoft();????????ms.Investor?=?investor;????????ms.Symbol?=?Microsoft;????????ms.Price?=?120.00;????????ms.Update();????????Console.ReadLine();????}}
运行后结果如下:
Notified Jom of Microsofts change to ¥120
可以看到,这段代码运行并没有问
原创力文档

文档评论(0)