观察者模式

观察者模式:

定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主体对象。这个主体对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己状态。

一、UML结构图

观察者模式

二、示例代码

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 
  6 /*
  7  * 
  8  */
  9 namespace 观察者模式
 10 {
 11     class Program
 12     {
 13         static void Main(string[] args)
 14         {
 15 
 16             Subject sb = new Subject();
 17             IObserver ob1 = new ConcreteObserver("张三",sb);
 18             sb.AddObserver(ob1);
 19 
 20             IObserver ob2 = new ConcreteObserver("李四",sb);
 21             sb.AddObserver(ob2);
 22 
 23             Console.WriteLine("被观察者状态变化:");
 24             sb.SubjectState = "我回来了";
 25             sb.Notify();
 26 
 27             Console.Read();
 28 
 29         }
 30     }
 31 
 32     #region 观察者 和 通知者 基类
 33     /// <summary>
 34     /// 主体通知者
 35     /// </summary>
 36     public abstract class SubejectNotify
 37     {
 38 
 39         //需要通知的观者者集合
 40         private List<IObserver> m_lstObserver = new List<IObserver>();
 41         //增加观察者
 42         public void AddObserver(IObserver ob)
 43         {
 44             if (ob != null)
 45                 m_lstObserver.Add(ob);
 46         }
 47         //移出观察者
 48         public void RemoveObserver(IObserver ob)
 49         {
 50             if (ob != null && m_lstObserver.Contains(ob))            
 51                 m_lstObserver.Remove(ob);            
 52         }
 53 
 54         //通知
 55         public void Notify()
 56         {
 57             foreach (IObserver ob in m_lstObserver)
 58                 ob.UpdateSelfState();
 59         }
 60 
 61     }
 62 
 63     /// <summary>
 64     /// 观察者
 65     /// </summary>
 66     public interface IObserver
 67     {
 68         /// <summary>
 69         /// 更新观察者自身状态
 70         /// </summary>
 71         void UpdateSelfState();
 72     }
 73 
 74     
 75     #endregion
 76 
 77     #region 被观者者
 78     /// <summary>
 79     /// 被观察者,继承SubjectNotify,已被监听
 80     /// </summary>
 81     public class Subject : SubejectNotify
 82     {
 83         private string m_State;
 84         public string SubjectState
 85         {
 86             get { return m_State; }
 87             set { m_State = value;
 88             Console.WriteLine(value);
 89             }
 90         }
 91     }
 92 
 93     /// <summary>
 94     /// 具体的观察者,具备Update方法,当观察到 被观察者 状态发生变化时,更新自己状态
 95     /// </summary>
 96     public class ConcreteObserver:IObserver
 97     {
 98         private string m_Name;
 99 
100         //引用具体的被观察对象,目的是获取被观察 变化的状态信息
101         private Subject m_Subject;
102         public ConcreteObserver(string name,Subject sub)
103         {
104             m_Name = name;
105             m_Subject = sub;
106         }
107 
108         public void UpdateSelfState()
109         {
110             Console.WriteLine(string.Format("{0}:我已经收到被观察者状态变化:{1}", m_Name,m_Subject.SubjectState));
111         }
112     }
113     #endregion
114     
115 }
示例代码