观察者模式

来源:互联网 发布:mysql默认地址 编辑:程序博客网 时间:2024/05/20 14:24

UML类图:



实现代码:

    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; }        }    }

客户端代码:

      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();

说明:

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


Cocoa Touch框架用两种技术改写了观察者模式----通知键-值观察者(Key-Value Observing).

两者的区别:

通知                                                                      键-值观察者

一个中心对象为所有观察者提供变更通知             被观察的对象直接向观察者发送通知

主要从广义上关注程序事件                                   绑定于特定对象属性的值




参考资料

-《大话设计模式》


0 0
原创粉丝点击