Observer
观察者模式:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新
别名:发布-订阅模式、模型-视图模式
在C#中观察者模式利用事件实现是最简单的,主要就分为两个角色

  • 主题:也可叫做发布者,当其发生改变时,负责通知所有注册的观察者
  • 观察者:也可叫做订阅者,接收主题的通知完成相应的操作。

    1、场景描述

    著名的例子: 猫叫->婴儿哭、老鼠跑、小偷吓一跳。

    2、实现

    ```csharp ///

    /// 主题—猫 /// public class CatSubject { // 这里的事件用来注册观察者 public event Action Observers;

    ///

    /// 猫叫 /// public void Miao() {

    1. Console.WriteLine("猫叫了...");
    2. if(Observers != null)
    3. Observers.Invoke();

    } } ///

    /// 观察者接口 /// public interface IObserver { /// /// 反应 /// void Response(); } /// /// 具体观察者角色 — 老鼠 /// public class MouseObserver : IObserver { public void Response() {

      Console.WriteLine("老鼠开始跑...");
    

    } } ///

    /// 具体观察者角色 — 小孩 /// public class BabyObserver : IObserver { public void Response() {

      Console.WriteLine("baby 开始哭...");
    

    } } ///

    /// 具体观察者角色 — 小偷 /// public class ThiefObserver : IObserver { public void Response() {

      Console.WriteLine("小偷吓了一跳...");
    

    } }

// 客户端调用 CatSubject cat = new CatSubject(); IObserver observer = null; observer = new BabyObserver(); // 注册事件 cat.Observers += observer.Response; observer = new MouseObserver(); cat.Observers += observer.Response; observer = new ThiefObserver(); cat.Observers += observer.Response;

cat.Miao(); ``` 上面的代码可以用UML表示如下:
image.png
抽象观察者角色也可以省去, 具体情况具体分析吧。

3、优缺点

优点:

  • 解耦
  • 触发机制

    4、应用场景

  • 对象间为一对多关系,一个对象的改变会引起其他对象的改变

  • 广播机制
  • 链式触发、逐级通知