设计模式行为型之观察者模式
定义
观察者模式 描述了 一种 一对多的关系。 当某一对象的状态发生改变时,其他对象会得到 改变的通知。并作出相应的反应。
模拟场景
猫叫了一声,随后引起一连串的动作,老鼠跑了,主人醒了,小孩儿哭了
两个角色
抽象主题(Subject):它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。
具体主题(ConcreteSubject):将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。
抽象观察者(Observer):为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
具体观察者(ConcreteObserver):实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调。
代码实现
1.定义一个抽象主题
/// <summary> /// 抽象主题 /// </summary> public abstract class ISubject { /// <summary> /// 观察者事件 /// </summary> public Action NotifyHandleEvent; public abstract void Miao(); /// <summary> /// 通知观察者方法 /// </summary> protected void Notify() { if (NotifyHandleEvent != null) { NotifyHandleEvent.Invoke(); } } }
2.定义一个具体主题 这里是发起者 猫
/// <summary> /// 具体主题类 猫 /// </summary> public class CatSubject : ISubject { public override void Miao() { Console.WriteLine("猫叫了一声... ..."); this.Notify(); } }
3.定义抽象观察者
/// <summary> /// 抽象观察者 /// </summary> public abstract class ObServer { /// <summary> /// 添加对应响应方法 /// </summary> /// <param name="subject"></param> public ObServer(ISubject subject) { subject.NotifyHandleEvent += this.Response; } public abstract void Response(); }
4.定义具体观察者
/// <summary> /// 老鼠 /// </summary> public class MouseObServer : ObServer { public MouseObServer(ISubject subject) : base(subject) { } public override void Response() { Console.WriteLine("老鼠跑了... ..."); } } /// <summary> /// 观察者主人 /// </summary> public class MasterObserver : ObServer { public MasterObserver(ISubject subject) : base(subject) { } public override void Response() { Console.WriteLine("主人醒了... ..."); } } /// <summary> /// 小孩 /// </summary> public class BabyObServer : ObServer { public BabyObServer(ISubject subject) : base(subject) { } public override void Response() { Console.WriteLine("小婴儿哭了... ..."); } }
上端测试代码
class Program { static void Main(string[] args) { //主题 ISubject subject = new CatSubject(); //观察者 ObServer cat = new MouseObServer(subject); ObServer master = new MasterObserver(subject); ObServer baby = new BabyObServer(subject); //发起动作 subject.Miao(); } }
运行结果如下: