• 观察者模式


    定义

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

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

    类实现方式的类图

    类实现方式的代码

     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
    收藏
    关注
    评论
  • 相关阅读:
    微博二级评论爬取
    爬取genome的网页和图片
    一个数据结构转换的问题
    SQLAlchemy ORM教程之二:Query
    SQLAlchemy中filter()和filter_by()有什么区别
    词云加显示条形图
    智联招聘的python岗位数据词云制作
    Python标准库——collections模块的Counter类
    MySQL5.6 windows msi安装介绍
    ICSharpCode.SharpZipLib.Zip
  • 原文地址:https://www.cnblogs.com/Joy-et/p/4873362.html
Copyright © 2020-2023  润新知