观察者模式(笔记)
观察者模式(主要是自己的笔记:水平较低,请勿语言攻击)
定义:观察者模式定义了对象之间的一对多的依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
设计原则:为了交互对象之间的松耦合设计而努力
当两个对象之间耦合,它们依然可以交互,但是不太清楚彼此的细节,观察者模式提供了一种对象设计,让主题和观察者之间松耦合,因为主题不需要知道观察者是谁,做了什么或其他任何细节,一个类成为观察者只需要实现观察者的接口,然后注册就可以成为观察者。主题不在乎是谁观察了它,它会发通知给所有实现了观察者接口的对象。
以下例子摘自headfirst 略微改动
1 publicinterface ISubject
2 {
3 //这两个方法都是需要一个观察者做为变量一个是用来注册的,一个是用来删除的
4 void RegisterObserver(IObserver observer);
5 void RemoveObserver(IObserver observer);
6 //当主题改变时通知所有的观察者
7 void NotifyObservers();
8 }
9
10 ///<summary>
11 /// WeatherData 实现了ISubject接口
12 ///</summary>
13 publicclass WeatherData : ISubject
14 {
15 //定义一个list记录观察者列表
16 private IList<IObserver> observers =new List<IObserver>();
17 privatefloat temperature;
18 privatefloat humidity;
19 privatefloat pressure;
20
21 publicvoid RegisterObserver(IObserver observer)
22 {
23 //每当有观察者注册时就在列表中记录下来
24 observers.Add(observer);
25 }
26
27 publicvoid RemoveObserver(IObserver observer)
28 {
29 //每当有观察者取消注册时就在列表中删除掉
30 int i = observers.IndexOf(observer);
31 if (i >=0)
32 observers.Remove(observer);
33 }
34
35 publicvoid NotifyObservers()
36 {
37 //通知每一个观察者
38 foreach (IObserver observer in observers)
39 observer.Update(temperature, humidity, pressure);
40 }
41
42 publicvoid MeasurementsChanged()
43 {
44 //当有变化时,通知观察者
45 NotifyObservers();
46 }
47
48 publicvoid SetMeasurements(float temperature, float humidity, float pressure)
49 {
50 this.temperature = temperature;
51 this.humidity = humidity;
52 this.pressure = pressure;
53 MeasurementsChanged();
54 }
55 }
56
57 publicinterface IObserver
58 {
59 //所有的观察者都必须实现Update方法以实现观察者接口,
60 void Update(float temp, float humidity, float pressure);
61 }
62
63 publicinterface IDisplayElement
64 {
65 void Display();
66 }
67
68 publicclass CurrentConditionsDisplay : IObserver, IDisplayElement
69 {
70 privatefloat temperature;
71 privatefloat humidity;
72 private ISubject weatherData;//组合对象
73 public CurrentConditionsDisplay(ISubject weatherData)
74 {
75 this.weatherData = weatherData;
76 weatherData.RegisterObserver(this);
77 }
78
79 publicvoid Update(float temperature, float humidity, float pressure)
80 {
81 this.temperature = temperature;
82 this.humidity = humidity;
83 Display();
84 }
85
86 publicvoid Display()
87 {
88 Console.WriteLine("Current conditions:"+ temperature +"F degrees and "+ humidity +"% humidity");
89 }
90 }
main函数调用
static void Main(string[] args)
{
#region ...Observer
WeatherData weatherdata = new WeatherData();
CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(weatherdata);
weatherdata.SetMeasurements(80, 65, 30.4f);
#endregion
Console.Read();
}
浙公网安备 33010602011771号