观察者模式:
定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主体对象。这个主体对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己状态。
一、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 }