设计模式之观察者模式

来源:互联网 发布:世界 变化 知乎 编辑:程序博客网 时间:2024/06/06 03:15

    概念:观察者模式(Observer)有时又被称为发布-订阅(Publish/Subscrib)模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,是它们能够自动更新自己。观察者模式(Observer)完美的将观察者和被观察的对象分离开。

    结构图:

 

    例子:员工们在讨论股票,老板走进办公室的时候,其他人都安静了,只有一个同事背对着老板,还在继续说股票的事情。

例子的结构图:

代码:

 //通知者接口    interface Subject    {        void Attach(Observer observer);        void Detach(Observer observer);        void Notify();        string SubjectState        {            get;            set;        }    }    //boss类    class Boss : Subject    {        //同事列表        private IList<Observer> observers = new List<Observer>();        private string action;        //增加        public void Attach(Observer observer)        { observers.Add(observer); }        //减少        public void Detach(Observer observer)        {            observers.Remove(observer);        }        //通知        public void Notify()        {            foreach (Observer o in observers)                o.Update();        }        //老板状态        public string SubjectState        {            get { return action; }            set { action = value; }        }    }    //抽象观察者    abstract class Observer    {        protected string name;        protected Subject sub;        public Observer(string name, Subject sub)        {            this.name = name;            this.sub = sub;        }        public abstract void Update();    }    //看股票的同事    class StockObserver : Observer    {        public StockObserver(string name, Subject sub)            : base(name, sub)        {        }        public override void Update()        {            Console.WriteLine("{0} {1} 关闭股票行情,继续工作",sub .SubjectState ,name );        }    }    //看NBA的同事    class NBAObserver : Observer    {        //public NBAObserver(String name, Secretary sub)        //    : base(name, sub)        public NBAObserver(String name, Subject sub)            : base(name, sub)        { }        public override void Update()        {            Console.WriteLine("{0} {1} 关闭NBA直播,继续工作!", sub.SubjectState , name);        }    }


客户端代码:

 

static void Main(string[] args)        {            //老板胡汉三            Boss huhansan = new Boss();            //看股票的同事            StockObserver tongshi1 = new StockObserver("魏关宅", huhansan);            //看NBA的同事            NBAObserver tongshi2 = new NBAObserver("易管查", huhansan);            huhansan.Attach(tongshi1  );            huhansan.Attach(tongshi2 );            huhansan.Detach(tongshi1);            //老板回来了            huhansan.SubjectState = "我胡汉三回来了";            //发出通知            huhansan.Notify();        }


    观察者模式的使用条件:1.当一个对象的改变需要同时改变其他对象,而且他不知道具体有多少对象有待改变时,应该考虑使用观察者模式。2.一个抽象模型有两个方面,其中一方面依赖于另一方面,这时用观察者模式可以将这两者封装在独立的对象中使它们各自独立的改变和复用。

    观察者模式的特点是他所做的工作其实就是在解除耦合。让耦合的双方都依赖于抽象,而不是依赖于具体。从而使得各自的变化都不会影响另一边的变化。

   

 

原创粉丝点击