zoukankan      html  css  js  c++  java
  • 观察者模式

    定义

    观察者模式,顾名思义就是观察者对某事物进行观察,当事物状态改变(符合条件)时,通知所有的订阅者,使他们做出对应的反应。

    一般可以通过类之间的引用调用来实现、也可以通过事件订阅的方式实现。

    类实现方式的类图

    类实现方式的代码

     1  public class Subject
     2     {
     3         public string State { get; set; }
     4     }
     5 
     6     public class Notifier
     7     {
     8         public IList<Observer> observers = null;
     9         private Subject subject=null;
    10         public Notifier(Subject subject)
    11         {
    12             this.subject = subject;
    13             observers = new List<Observer>();
    14         }
    15         public void ChangeState(string state)
    16         {
    17             subject.State = state;
    18             foreach (var item in observers)
    19             {
    20                 item.Reflect();
    21             }
    22         }
    23     }
    24     public abstract class Observer
    25     {
    26         //TODO other property...
    27 
    28         /// <summary>
    29         /// 
    30         /// </summary>
    31         public abstract void Reflect();
    32         
    33     }
    34     public class ObserverA : Observer
    35     {
    36         public override void Reflect()
    37         {
    38             Console.WriteLine("A got it");
    39         }
    40     }
    41     public class ObserverB : Observer
    42     {
    43         public override void Reflect()
    44         {
    45             Console.WriteLine("B see it");
    46         }
    47     }
    View Code

    事件通知形式

     1    public delegate void NotifyHandler();
     2     public class Subject
     3     {
     4         public string State { get; set; }
     5     }
     6     public class Notifier
     7     {
     8         public event NotifyHandler Nofify;
     9         private Subject subject = null;
    10         public Notifier(Subject subject )
    11         {
    12             this.subject=subject;
    13         }
    14         public void OnChangeState(string state)
    15         {
    16             subject.State = state;
    17             if (Nofify != null)
    18             {
    19                 Nofify();
    20             }
    21         }
    22     }
    23     public class Observer
    24     {
    25         public Observer(Notifier notifier)
    26         {
    27             notifier.Nofify += notifier_Nofify;
    28         }
    29 
    30         void notifier_Nofify()
    31         {
    32             //TODO...reflect
    33         }
    34     
    View Code

    总结

    观察者模式,着重于条件触发点到达时对一类对象进行通知,已达到广播通知的效果。

    关于类实现、还是事件订阅方式的实现,主要看功能业务,事件订阅方式简化了代码,同时也比较明了。而类实现则增加了耦合,并且要求订阅者有统一基类或者接口,但定义类的功能有时可以照顾到其他的业务实现。

    Top
    收藏
    关注
    评论
  • 相关阅读:
    MySQL数据丢失讨论
    分布式系统之Quorum (NRW)算法
    阿里巴巴-OS事业群-OS手机事业部-系统服务部门招聘Java开发工程师,有意者请进来
    EQueue
    ENode 2.0
    关于MySQL的在线扩容
    我收藏的技术知识图(每张都是大图)
    关于实现一个基于文件持久化的EventStore的核心构思
    Actor的原理
    OAuth 2.0 授权原理
  • 原文地址:https://www.cnblogs.com/Joy-et/p/4873362.html
Copyright © 2011-2022 走看看