1.概念
观察者模式(有时又被称为发布-订阅Subscribe>模式、模型-视图View>模式、源-收听者Listener>模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。
2.角色
2.1 抽象主题(Subject):它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。
2.2 具体主题(ConcreteSubject):将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。
2.3 抽象观察者(Observer):为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
2.4 具体观察者(ConcreteObserver):实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调。
3.具体实现之委托实现。
模拟的场景:猫叫了,老鼠跑了、主人醒了。
3.1 ISubject 抽象
public delegate void NotifyHandler();
public abstract class ISubject { public event NotifyHandler NotifyEvent; protected void Notify() { if (NotifyEvent != null) NotifyEvent(); } public virtual void Run() { } }
3.2 CatSubject
public class CatSubject : ISubject { public override void Run() { Console.WriteLine("猫叫了..."); this.Notify(); } }
3.3 Observer
public abstract class Observer { protected Observer(ISubject sub) { sub.NotifyEvent += Response; } public abstract void Response(); }
3.4 MouseObserver
public class MouseObserver : Observer { public MouseObserver(ISubject sub) : base(sub) { } public override void Response() { Console.WriteLine("老鼠跑了!"); } }
3.5 MasterObserver
public class Master2Observer : Observer { public Master2Observer(ISubject sub):base(sub) { } public override void Response() { Console.WriteLine("主人醒了...."); } }
3.6 调用
var sub = new CatSubject(); var mouse = new MouseObserver(sub); var master = new Master2Observer(sub); sub.Run();
3.7 结果