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 下载。