极速理解设计模式系列:2.观察者模式(Observer Pattern)

简介:

4个角色:被观察者(Subject/目标对象接口),具体被观察者(ConcreteSubject/具体目标对象),观察者(Observer),具体观察者(ConcreteObserver)
             被观察者(Subject/目标对象接口):目标对象的抽象接口

       具体被观察者(ConcreteSubject/具体目标对象):目标对象的具体实现,能够添加、删除具体对象并且通知所有的观察者对象。

       观察者:观察到目标对象的动作的时候有所反应的接口

       具体观察者:观察者对象的具体实现,并且有相关动作。
         实现思路:客户端创建目标对象,目标对象添加所有的观察者对象,然后目标对象更新,所有的观察者对象产生反应。

 类图:       


        应用场景:在Silverlight的某个系统中我们需要做一个消息通知管理,当接收到消息的时候,系统右下角弹出一个Tip窗口通知有消息,在系统的右上角出现一个短消息的图标开始闪亮表示有新消息。


        分析:在这里消息是一个类作为目标对象,而Tip窗口是另外一个类作为一个观察者;右上角的图标也是另外一个类,它控制图标是否闪亮,作为另外一个观察者。当消息出现的时候,通知两个观察者开始动作。

        下面我们在控制台程序去演示一下如何使用Observer Pattern:

        一、被观察者(Subject/目标对象接口)

 


 
 
  1. /// <summary> 
  2. /// 需要被观察的对象:目标对象 
  3. /// </summary> 
  4. interface IMsg 
  5.     void AddObserver(IObs obs); 
  6.     void RemoveObserver(IObs obs); 
  7.     void Notify(); 

        二、具体被观察者(ConcreteSubject/具体目标对象)

 


 
 
  1. /// <summary> 
  2.  /// 信息类 
  3.  /// </summary> 
  4.  class MsgClass:IMsg 
  5.  { 
  6.      List<IObs> ObsList = new List<IObs>(); 
  7.       
  8.      /// <summary> 
  9.      /// 添加观察者 
  10.      /// </summary> 
  11.      /// <param name="obs"></param> 
  12.      public void AddObserver(IObs obs) 
  13.      { 
  14.          ObsList.Add(obs); 
  15.      } 
  16.       
  17.      /// <summary> 
  18.      /// 移出观察者列表 
  19.      /// </summary> 
  20.      /// <param name="obs"></param> 
  21.      public void RemoveObserver(IObs obs) 
  22.      { 
  23.          ObsList.Remove(obs); 
  24.      } 
  25.  
  26.      /// <summary> 
  27.      /// 通知观察者 
  28.      /// </summary> 
  29.      public void Notify() 
  30.      { 
  31.          Console.WriteLine("在这里目标对象属性变化"); 
  32.          foreach (IObs o in ObsList) 
  33.          { o.Active(); } 
  34.      } 
  35.  } 

        三、观察者(Observer)

 


 
 
  1. /// <summary> 
  2.  /// 观察者 
  3.  /// </summary> 
  4.  interface IObs 
  5.  { 
  6.      void Active(); 
  7.  } 

        四、具体观察者(ConcreteObserver)

 


 
 
  1. class ObsTipShowMsg : IObs 
  2.     public void Active() 
  3.     { 
  4.         Console.WriteLine("通过TipMessage的方式显示新信息"); 
  5.     } 
  6. class ObsLightShowMsg : IObs 
  7.     public void Active() 
  8.     { 
  9.         Console.WriteLine("通过图标闪动方式通知新信息"); 
  10.     } 

        五、客户端

 


 
 
  1. class Program 
  2.     static void Main(string[] args) 
  3.     { 
  4.         MsgClass msg = new MsgClass(); 
  5.  
  6.         ObsTipShowMsg tipShowMsg = new ObsTipShowMsg(); 
  7.         ObsLightShowMsg lightShowMsg = new ObsLightShowMsg(); 
  8.         msg.AddObserver(tipShowMsg); 
  9.         msg.AddObserver(lightShowMsg); 
  10.         msg.Notify(); 
  11.         Console.ReadLine(); 
  12.     } 

        如需源码请点击 ObserverPattern.rar 下载。



本文转自程兴亮 51CTO博客,原文链接:http://blog.51cto.com/chengxingliang/826934

相关文章
|
8月前
|
设计模式 存储 Java
认真学习设计模式之观察者模式(Observer Pattern)
认真学习设计模式之观察者模式(Observer Pattern)
80 0
|
8月前
|
设计模式 Java
Java设计模式:什么是观察者模式(Observer Pattern)?
Java设计模式:什么是观察者模式(Observer Pattern)?
73 0
|
设计模式
设计模式16 - 观察者模式【Observer Pattern】
设计模式16 - 观察者模式【Observer Pattern】
54 0
|
设计模式
设计模式19 - 状态模式【State Pattern】
设计模式19 - 状态模式【State Pattern】
49 0
|
存储 设计模式 前端开发
详解Java设计模式之观察者模式(Observer Pattern)
详解Java设计模式之观察者模式(Observer Pattern)
180 0
详解Java设计模式之观察者模式(Observer Pattern)
|
Java 程序员
行为型模式 - 观察者模式(Observer Pattern)
行为型模式 - 观察者模式(Observer Pattern)
|
设计模式
设计模式实战-状态模式(State Pattern)(中)
设计模式实战-状态模式(State Pattern)(中)
142 0
设计模式实战-状态模式(State Pattern)(中)
|
设计模式
【愚公系列】2021年12月 二十三种设计模式(十九)-观察者模式(Observer Pattern)
【愚公系列】2021年12月 二十三种设计模式(十九)-观察者模式(Observer Pattern)
121 0
【愚公系列】2021年12月 二十三种设计模式(十九)-观察者模式(Observer Pattern)
|
设计模式 uml
设计模式实战-状态模式(State Pattern)
设计模式实战-状态模式(State Pattern)
235 0
|
设计模式 Java
设计模式九: 观察者模式(Observer Pattern)
简介 观察者属于行为型模式的一种, 又叫发布-订阅模式. 如果一个对象的状态发生改变,依赖他的对象都将发生变化, 那么这种情况就适合使用观察者模式. 它包含两个术语,主题(Subject),观察者(Observer), 主题管理一个观察者的列表, 并在状态发生变化时通知到他们.
1051 0