文章出處

 知識點

  使對象之間達到松耦合的效果。 

  觀察者模式定義了對象之間一對多的關系。主題用一個共同的接口來更新觀察者。

  觀察者和被觀察者之間通過松耦合的方式結合,被觀察者不用理會觀察者的實現細節,只需要觀察者實現了觀察接口(即所謂的注冊)。

 示例代碼

    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     }

最后來調用測試一下:

小結

  觀察者模式定義了對象之間一對多的依賴,當一個狀態發生改變時,它的所有依賴都會收到通知并自動更新。  

  觀察者模式的作用,當兩個對象之間松耦合,它們依然可以交互,但是不用關注彼此之間實現的細節。


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()