使對象之間達到松耦合的效果。
觀察者模式定義了對象之間一對多的關系。主題用一個共同的接口來更新觀察者。
觀察者和被觀察者之間通過松耦合的方式結合,被觀察者不用理會觀察者的實現細節,只需要觀察者實現了觀察接口(即所謂的注冊)。
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 }
最後來調用測試一下:
觀察者模式定義了對象之間一對多的依賴,當一個狀態發生改變時,它的所有依賴都會收到通知並自動更新。
觀察者模式的作用,當兩個對象之間松耦合,它們依然可以交互,但是不用關注彼此之間實現的細節。