程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 每天一段筆記-觀察者模式(Observer pattern),observerpattern

每天一段筆記-觀察者模式(Observer pattern),observerpattern

編輯:C#入門知識

每天一段筆記-觀察者模式(Observer pattern),observerpattern


 知識點

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

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

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

 示例代碼

    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     }

最後來調用測試一下:

小結

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

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved