• 观察者模式


    观察者模式:(发布-订阅模式)定义了一种一对多的依赖关系,让多个观察者对象同时监听某个主题对象。这个主题对象在状态发生变化时,会通知所有的观察者对象,使它们能够自动更新自己。

    结构图:

    Subject类,可翻译为主题或者抽象通知者,一般用一个抽象类或者一个接口实现。

     1 abstract class Subject
     2     {
     3         private IList<Observer> observers = new List<Observer>();
     4 
     5         //增加观察者
     6         public void Attach(Observer observer)
     7         {
     8             observers.Add(observer);
     9         }
    10         //移除观察者
    11         public void Detach(Observer observer)
    12         {
    13             observers.Remove(observer);
    14         }
    15         //通知
    16         public void Notify()
    17         {
    18             foreach (Observer o in observers)
    19             {
    20                 o.Update();
    21             }
    22         }
    23     }
    Subject类

    Observer类,抽象观察者,为所有的具体观察者定义一个接口,在得到主题(抽象通知者)的通知时及时更新自己。

     1 abstract class Observer
     2     {
     3         public abstract void Update();
     4     }
     5 
     6     class ConcreteObserver : Observer
     7     {
     8         private string name;
     9         private string observerState;
    10         private ConcreteSubject subject;
    11 
    12         public ConcreteObserver(
    13           ConcreteSubject subject, string name)
    14         {
    15             this.subject = subject;
    16             this.name = name;
    17         }
    18         //更新
    19         public override void Update()
    20         {
    21             observerState = subject.SubjectState;
    22             Console.WriteLine("观察者{0}的新状态是{1}",
    23               name, observerState);
    24         }
    25 
    26         public ConcreteSubject Subject
    27         {
    28             get { return subject; }
    29             set { subject = value; }
    30         }
    31     }
    Observer & ConcreteObserver

    使用:当一个对象的改变需要同时改变其他对象的时候(而且不知道具体有多少个对象有待改变时,应该考虑使用观察者模式。

    PS:观察者模式所做的工作其实就是在解除耦合,让耦合的双方都依赖于抽象,而不是依赖于具体。从而使得各自的变化都不会影响另一边的变化。

  • 相关阅读:
    排序算法之选择排序
    聊聊索引失效的10种场景,太坑了
    tensorflow2.7M1安装依赖openblas问题
    mybatis 拦截sql修改
    Spring 常见面试题
    centos7 安装Development Tools
    centos7 修改mac地址
    .net framework 使用Apollo 配置中心
    .net core (.net6) 读取配置文件 appsettings.json
    C#.NET FRAMEWORK XML私钥转PKCS1,PKCS8
  • 原文地址:https://www.cnblogs.com/virus1102/p/Observer.html
Copyright © 2020-2023  润新知