观察者模式是设计模式中行为模型的一种,是定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。
典型的应用情形为:
夜里有一只猫大叫了一声,同处一屋的老鼠接受到了猫大叫的信息,于是开始逃跑。同样,主人听到了,被吵醒了;小孩子听到了,被吓哭了。
实现代码如下:
1using System;
2
3namespace DelegateEvent
4
5{
6
7 /**//// <summary>
8
9 /// Subject 的摘要说明。
10
11 /// 被观察者抽象基类
12
13 /// 所有被观察者对象都继承此类
14
15 /// 做为抽象基类,此类不允许直接进行实例化
16
17 /// 此类中首先定义委托
18
19 /// 再有委托定义事件
20
21 /// 然后创立与委托想关联的方法Notify
22
23 /// </summary>
24
25 public abstract class Subject
26
27 {
28
29 public Subject()
30
31 {
32
33 //
34
35 // TODO: 在此处添加构造函数逻辑
36
37 //
38
39 }
40
41 /**//// <summary>
42
43 /// 创建一个委托
44
45 /// </summary>
46
47 public delegate void SubEventHandler();
48
49 /**//// <summary>
50
51 /// 根据SubEventHandler创建一个事件
52
53 /// </summary>
54
55 public event SubEventHandler SubEvent;
56
57 /**//// <summary>
58
59 /// 将于委托相连接的方法
60
61 /// </summary>
62
63 protected void Notify()
64
65 {
66
67 if(this.SubEvent!=null)
68
69 this.SubEvent();
70
71 }
72
73 }
74
75}
76
77//------------------------------------------------------------------------------------------
78
79被观察者基类完成后我们再来创建观察者基类Observer.
80
81namespace DelegateEvent
82
83{
84
85 /**//// <summary>
86
87 /// Observer 的摘要说明。
88
89 /// 观察者抽象基类
90
91 /// 所有观察者对象都由此类派生
92
93 /// 使用此类进行对事件的注册
94
95 /// 并和事件的方法关联
96
97 /// 另外定义了一个抽象方法Response
98
99 /// 可以由子类来进行覆盖
100
101 /// </summary>
102
103 public abstract class Observer
104
105 {
106
107 public Observer(Subject childModel)
108
109 {
110
111 //注册SubEvent事件通过SubEventHandler委托和Response方法关联
112
113 //子类通过调用此构造函数完成事件的注册
114
115 childModel.SubEvent+=new Subject.SubEventHandler(Response);
116
117 }
118
119
120
121 /**//// <summary>
122
123 /// 抽象方法,用于引发事件
124
125 /// </summary>
126
127 public abstract void Response();
128
129 }
130
131}
132
133同理,我们还可以继续创建另一个观察者基类,用来响应不同的事件的方法。
134
135namespace DelegateEvent
136
137{
138
139 /**//// <summary>
140
141 /// Observer2 的摘要说明。
142
143 /// 注册了两个事件的方法。
144
145 /// </summary>
146
147 public abstract class Observer2
148
149 {
150
151 public Observer2(Subject childModel)
152
153 {
154
155 childModel.SubEvent+=new Subject.SubEventHandler(Response);
156
157 childModel.SubEvent+=new Subject.SubEventHandler(Response2);
158
159 }
160
161 public abstract void Response();
162
163 public abstract void Response2();
164
165 }
166
167}
168
169//-------------------------------------------------------------------------------------------------------
170
171现在,我们来针对这个实例中的猫大叫这个引发事件进行解析。
172
173namespace DelegateEvent
174
175{
176
177 /**//// <summary>
178
179 /// Cat 的摘要说明。
180
181 /// 此类作为被观察者对象
182
183 /// 直接继承Subject类
184
185 /// 使用一个Cry方法,调用Notify方法起用先前定义的SubEvent事件
186
187 /// </summary>
188
189 public class Cat:Subject
190
191 {
192
193 public Cat()
194
195 {
196
197 //
198
199 // TODO: 在此处添加构造函数逻辑
200
201 //
202
203 }
204
205 public void Cry()
206
207 {
208
209 System.Console.WriteLine("Cat Cry..");
210
211 //调用从ModelBase继承过来的Notify()
212
213 this.Notify();
214
215 }
216
217 }
218
219}
220
221// 这样一个被观察者对象就完成了。
222
223//--------------------------------------------------------------------------------------------------------------------
224
225被观察者对象有了,我们再来创建具体的观察者对象。此例中,有主人,小孩和老鼠对猫的叫声做出了反应,因此我们可以创建三个类,分别对主人、小孩和老鼠进行响应。其中,主人和老鼠对应Observer类,响应其中的一个事件;而小孩则继承Observer2类,响应其中的两个事件。
226
227//------------------------------------观察者--主人类---------------------------------------------------
228
229namespace DelegateEvent
230
231{
232
233 /**//// <summary>
234
235 /// Master 的摘要说明。
236
237 /// </summary>
238
239 public class Master:Observer
240
241