.NET设计模式:观察者模式(Observer Pattern)
2011-05-10 19:30
591 查看
概述
在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系” ——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化。使用面 向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合。
意图
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。[GOF 《设计模式》]
结构图
1.使用面向对象的抽象,Observer模式使得我们可以独立地改变目标与观察者,从而使二者之间的依赖关系达到松耦合。
2.目标发送通知时,无需指定观察者,通知(可以携带通知信息作为参数)会自动传播。观察者自己决定是否需要订阅通知。目标对象对此一无所知。
3.在C#中的Event。委托充当了抽象的Observer接口,而提供事件的对象充当了目标对象,委托是比抽象Observer接口更为松耦合的设计。
适用性
1.当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
2.当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。
3.当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的。
总结
通过Observer模式,把一对多对象之间的通知依赖关系的变得更为松散,大大地提高了程序的可维护性和可扩展性,也很好的符合了开放-封闭原则。
在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系” ——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化。使用面 向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合。
意图
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。[GOF 《设计模式》]
结构图
class Program { static void Main(string[] args) { Stock stock = new Stock("Microsoft", 120.00); Investor investor = new Investor("Jom"); stock.NotifyEvent += new NotifyEventHandler(investor.SendData); stock.Update(); Console.ReadLine(); } } public delegate void NotifyEventHandler(object sender); public class Stock { public NotifyEventHandler NotifyEvent; private String _symbol; private double _price; public Stock(String symbol, double price) { this._symbol = symbol; this._price = price; } public void Update() { OnNotifyChange(); } public void OnNotifyChange() { if (NotifyEvent != null) { NotifyEvent(this); } } public String Symbol { get { return _symbol; } } public double Price { get { return _price; } } } public class Investor { private string _name; public Investor(string name) { this._name = name; } public void SendData(object obj) { if (obj is Stock) { Stock stock = (Stock)obj; Console.WriteLine("Notified {0} of {1}'s " + "change to {2:C}", _name, stock.Symbol, stock.Price); } } }效果及实现要点
1.使用面向对象的抽象,Observer模式使得我们可以独立地改变目标与观察者,从而使二者之间的依赖关系达到松耦合。
2.目标发送通知时,无需指定观察者,通知(可以携带通知信息作为参数)会自动传播。观察者自己决定是否需要订阅通知。目标对象对此一无所知。
3.在C#中的Event。委托充当了抽象的Observer接口,而提供事件的对象充当了目标对象,委托是比抽象Observer接口更为松耦合的设计。
适用性
1.当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
2.当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。
3.当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的。
总结
通过Observer模式,把一对多对象之间的通知依赖关系的变得更为松散,大大地提高了程序的可维护性和可扩展性,也很好的符合了开放-封闭原则。
相关文章推荐
- .NET设计模式(19):观察者模式(Observer Pattern)
- 【转载】.NET设计模式之观察者模式(Observer Pattern)
- .NET设计模式(19):观察者模式(Observer Pattern)(转)
- .NET设计模式(19):观察者模式(Observer Pattern)
- .NET设计模式(19):观察者模式(Observer Pattern)
- .NET设计模式(19):观察者模式(Observer Pattern)
- .NET设计模式:观察者模式(Observer Pattern)
- .NET设计模式(19):观察者模式(Observer Pattern)
- .NET设计模式-观察者模式(Observer Pattern)
- .NET设计模式(19):观察者模式(Observer Pattern)
- 我理解设计模式C++实现观察者模式Observer Pattern
- 设计模式 - 观察者模式(Observer Pattern) 详细解释
- 设计模式学习——观察者模式(Observer Pattern)
- 设计模式学习总结-观察者模式(Observer Pattern)
- 设计模式----行为型模式之观察者模式(Observer Pattern)
- 设计模式----行为型模式之观察者模式(Observer Pattern)
- 设计模式记--Observer Pattern观察者模式
- 设计模式之--观察者模式(Observer Pattern)(22)
- 设计模式之观察者模式(Observer Pattern)(一)
- 我所理解的设计模式(C++实现)——观察者模式(Observer Pattern)