设计模式之观察者

来源:互联网 发布:中国食品安全数据分析 编辑:程序博客网 时间:2024/04/25 09:15

观察者模式(Observer)

意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。适用性:当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的。

这里写图片描述

被观察者对象接口:    interface IObservable{        void AddObserver(IObserver pObserver);        void DeleteObserver(IObserver pObserver);        void NotifyObservers(string context);    }
被观察者对象实现:public class ObservableA:IObservable{    public void  AddObserver(IObserver pObserver){        m_observerList.Add (pObserver);    }    public void DeleteObserver(IObserver pObserver){        for (int i = 0; i < m_observerList.Count; i++) {            if (m_observerList[i].getName()            ==pObserver.getName()) {                m_observerList.Remove (m_observerList[i]);            }        }           }    public void NotifyObservers(string context){        foreach (var item in m_observerList) {            item.Update (context);        }    }    public void HaveFun(){        Console.WriteLine ("have fun!!!");        this.NotifyObservers ("!!!");    }    public ObservableA(){        m_observerList = new List<IObserver> ();    }    private List<IObserver> m_observerList;}   
观察者抽象:    public abstract class IObserver    {        public abstract void Update (string context);        public abstract string getName ();        protected string name;        public IObserver(string name){            this.name = name;        }    }
观察者实现:public class ObserverA:IObserver{    public ObserverA(string name):base(name){}    public override void Update (string context){        this.Report (context);    }    public override string getName (){        return this.name;    }    private void Report(string report){        Console.WriteLine ("OA:ObservableA hava fun!!!");    }}public class ObserverB:IObserver{    public ObserverB(string name):base(name){}    public override void Update (string context){        this.Report (context);    }    public override string getName (){        return this.name;    }    private void Report(string report){        Console.WriteLine ("OB:ObservableA hava fun!!!");    }}
测试:    public static void Main(string []argv){        ObservableA oba = new ObservableA ();        ObserverA oa = new ObserverA ("oa");        ObserverB ob = new ObserverB ("ob");        oba.AddObserver (oa);        oba.AddObserver (ob);        oba.HaveFun ();        oba.DeleteObserver (oa);        oba.HaveFun ();    }

这里写图片描述

0 0