前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式之观察者模式

设计模式之观察者模式

作者头像
beginor
发布2020-08-10 11:24:04
2680
发布2020-08-10 11:24:04
举报

设计模式之观察者模式

结构

观察者模式
观察者模式

说明

Define a one-to-many dependency between objects where a state change in one object results with all its dependents being notified and updated automatically.

在对象间定义一个一对多的联系性,由此当一个对象改变了状态,所有其他相关的对象会被通知并且自动刷新。

适用条件

  • 当抽象个体有两个相互依赖的层面时。 封装这些层面在单独物件内将可允许程序设计师单独地去变更与重复使用这些物件, 而不会产生两者之间的交互问题;
  • 当其中一个物件的变更会影响其他物件, 却又不知道多少无间必须被同时更新;
  • 当物件应该有能力通知其它物件, 又不应知道其他物件的实现细节时。

实现

代码语言:javascript
复制
public interface ISubject {

   void Attach(IObserver observer);

   void Detach(IObserver observer);

   void Notify();
}

public interface IObserver {

   void Update();

}

public class ConcreteSubject : ISubject {

   private readonly IList<IObserver> _observers = new List<IObserver>();

   public string State {
      get;
      set;
   }

   public void Attach(IObserver observer) {
      if (!this._observers.Contains(observer)) {
         this._observers.Add(observer);
      }
   }

   public void Detach(IObserver observer) {
      if (this._observers.Contains(observer)) {
         this._observers.Remove(observer);
      }
   }

   public void Notify() {
      foreach (var observer in _observers) {
         observer.Update();
      }
   }
}

public class ConcreteObserver : IObserver {
   
   private readonly ConcreteSubject _subject;

   public ConcreteObserver(ConcreteSubject subject) {
      this._subject = subject;
   }

   public void Update() {
      Console.WriteLine("Observer: subject state updated to {0} .", this._subject.State);
   }
}

class Client {

   static void Main(string[] args) {
      var subject = new ConcreteSubject();

      subject.Attach(new ConcreteObserver(subject));
      subject.Attach(new ConcreteObserver(subject));

      subject.State = "State1";
      subject.Notify();

      subject.State = "State2";
      subject.Notify();

      Console.ReadKey();
   }
}

.Net 4.0 内置了 IObservable 与 IObserver 接口用于实现观察者模式, 这两个接口的定义如下:

代码语言:javascript
复制
public interface IObservable<out T> {

   IDisable Subscribe(IObserver<T> observer);

}

public interface IObserver<in T> {

   void Next(T value);

   void OnError(Exception ex);

   void OnCompleted();
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 设计模式之观察者模式
    • 结构
      • 说明
        • 适用条件
          • 实现
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档