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