观察者模式

来源:互联网 发布:yum安装nginx 编辑:程序博客网 时间:2024/06/10 12:30

观察者模式:又叫发布-订阅模式

定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有的观察者对象,使它们能够自动更新自己。

当一个对象的改变需要同时改变其他对象的时候使用。

主要是解耦的过程,让耦合的双发都依赖与抽象,而不是依赖于具体,从而使得各自的变化都不会影响另一边的变化。

 

    class Program    {        static void Main(string[] args)        {            ConcreteSubject s = new ConcreteSubject();            s.Attach(new ConcreteObserver(s, "X"));            s.Attach(new ConcreteObserver(s, "Y"));            s.Attach(new ConcreteObserver(s, "Z"));            s.SubjectState = "ABC";            s.Notify();            Console.Read();        }    }    abstract class Subject    {        private IList<Observer> observers = new List<Observer>();        //增加观察者        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();            }        }    }    //具体通知者    class ConcreteSubject : Subject    {        private string subjectState;        //具体通知者状态        public string SubjectState        {            get { return subjectState; }            set { subjectState = value; }        }    }    abstract class Observer    {        public abstract void Update();    }    class ConcreteObserver : Observer    {        private string name;        private string observerState;        private ConcreteSubject subject;        public ConcreteObserver(          ConcreteSubject subject, string name)        {            this.subject = subject;            this.name = name;        }        //更新        public override void Update()        {            observerState = subject.SubjectState;            Console.WriteLine("观察者{0}的新状态是{1}",              name, observerState);        }        public ConcreteSubject Subject        {            get { return subject; }            set { subject = value; }        }    }


观察者模式不足:update函数名称都一样,有时候函数名可能不同。

事件委托:一种引用方法的类型,一旦为委托分配了方法,委托将于该方法具有完全相同的行为。委托方法的使用可以像其他任何方法一样,具有参数和返回值。委托可以看作是对函数的抽象时函数的类,委托的实例将代表一个具体的函数。即函数指针。

    class Program    {        static void Main(string[] args)        {            //老板胡汉三            Boss huhansan = new Boss();            //看股票的同事            StockObserver tongshi1 = new StockObserver("魏关姹", huhansan);            //看NBA的同事            NBAObserver tongshi2 = new NBAObserver("易管查", huhansan);            huhansan.Update += new EventHandler(tongshi1.CloseStockMarket);            huhansan.Update += new EventHandler(tongshi2.CloseNBADirectSeeding);            //老板回来            huhansan.SubjectState = "我胡汉三回来了!";            //发出通知            huhansan.Notify();            Console.Read();        }    }    //通知者接口    interface Subject    {        void Notify();        string SubjectState        {            get;            set;        }    }    //事件处理程序的委托    delegate void EventHandler();    class Secretary : Subject    {        //声明一事件Update,类型为委托EventHandler        public event EventHandler Update;        private string action;        public void Notify()        {            Update();        }        public string SubjectState        {            get { return action; }            set { action = value; }        }    }    class Boss : Subject    {        //声明一事件Update,类型为委托EventHandler        public event EventHandler Update;        private string action;        public void Notify()        {            Update();        }        public string SubjectState        {            get { return action; }            set { action = value; }        }    }    //看股票的同事    class StockObserver    {        private string name;        private Subject sub;        public StockObserver(string name, Subject sub)        {            this.name = name;            this.sub = sub;        }        //关闭股票行情        public void CloseStockMarket()        {            Console.WriteLine("{0} {1} 关闭股票行情,继续工作!", sub.SubjectState, name);        }    }    //看NBA的同事    class NBAObserver    {        private string name;        private Subject sub;        public NBAObserver(string name, Subject sub)        {            this.name = name;            this.sub = sub;        }        //关闭NBA直播        public void CloseNBADirectSeeding()        {            Console.WriteLine("{0} {1} 关闭NBA直播,继续工作!", sub.SubjectState, name);        }    }


 

0 0