观察者模式(Observer pattern)

 知识点

  使对象之间达到松耦合的效果。 

  观察者模式定义了对象之间一对多的关系。主题用一个共同的接口来更新观察者。

  观察者和被观察者之间通过松耦合的方式结合,被观察者不用理会观察者的实现细节,只需要观察者实现了观察接口(即所谓的注册)。

 示例代码

    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     }

最后来调用测试一下:

小结

  观察者模式定义了对象之间一对多的依赖,当一个状态发生改变时,它的所有依赖都会收到通知并自动更新。  

  观察者模式的作用,当两个对象之间松耦合,它们依然可以交互,但是不用关注彼此之间实现的细节。

posted @ 2015-05-22 06:54  高效养猪倌  阅读(585)  评论(0编辑  收藏  举报