使對象之間達到松耦合的效果。
觀察者模式定義了對象之間一對多的關系。主題用一個共同的接口來更新觀察者。
觀察者和被觀察者之間通過松耦合的方式結合,被觀察者不用理會觀察者的實現細節,只需要觀察者實現了觀察接口(即所謂的注冊)。
public interface Subject
{
void RegisterObserver(Observer Observer);
void RemoveObserver(Observer Observer);
//當主題發生改變時,該方法會被調用,即通知所有觀察者
void NotifyObserver();
}
//主題(被觀察的對象)
public class WeatherData : Subject
{
private List<Observer> observers;
public float Temperature
{
get;
private set;
}
public float Humidity
{
get;
private set;
}
public float Pressure
{
get;
private set;
}
public WeatherData() {
observers = new List<Observer>();
}
#region Subject 成員
public void RegisterObserver(Observer Observer)
{
observers.Add(Observer);//注冊觀察者
}
public void RemoveObserver(Observer Observer)
{
observers.Remove(Observer);//取消觀察者的的注冊
}
public void NotifyObserver()
{
observers.ForEach(o => {
((Observer)o).Update(Temperature, Humidity, Pressure);
});
}
#endregion
public void DataChanged() {
NotifyObserver();
}
public void SetMeasurements(float temp, float humidity, float pressure) {
Temperature = temp;
Humidity = humidity;
Pressure = pressure;
DataChanged();
}
}
1 //觀察者更新數據接口
2 public interface Observer
3 {
4 void Update(float temp,float humidity,float pressure);
5 }
6
7 //顯示數據接口
8 public interface DispalyElement
9 {
10 void Dispay();
11 }
1 //觀察者
2 public class CurrentConditionDisplay : Observer, DispalyElement
3 {
4 readonly Subject _subject;
5 public Subject Subject
6 {
7 get
8 {
9 return _subject;
10 }
11 }
12
13 public float Temperature
14 {
15 get;
16 private set;
17 }
18
19 public float Humidity
20 {
21 get;
22 private set;
23 }
24
25 public CurrentConditionDisplay(Subject subject)
26 {
27 _subject = subject;
28 _subject.RegisterObserver(this);
29 }
30
31
32 #region Observer 成員
33
34 public void Update(float temp, float humidity, float pressure)
35 {
36 Temperature = temp;
37 Humidity = humidity;
38 Dispay();
39 }
40
41 #endregion
42
43 #region DispalyElement 成員
44
45 public void Dispay()
46 {
47 Console.WriteLine("{0}F {1}%", this.Temperature, this.Humidity);
48 }
49
50 #endregion
51 }
最後來調用測試一下:
觀察者模式定義了對象之間一對多的依賴,當一個狀態發生改變時,它的所有依賴都會收到通知並自動更新。
觀察者模式的作用,當兩個對象之間松耦合,它們依然可以交互,但是不用關注彼此之間實現的細節。