设计模式(3)观察者模式

来源:互联网 发布:js e.target ie 编辑:程序博客网 时间:2024/04/28 08:13

概述

在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系” ——一个对象(目标对象)的状态发生改变,所有的

依赖对象(观察者对象)都将得到通知。如果耦合过强,代码的维护性和扩展性就会变差。这样一来就引出了观察者模

式(Observer),也称发布-订阅模式(Publish/Subscribe)。所有的操作都是通过调用接口来实现,将这种依赖关系

弱化,并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合。 

结构图


具体模式


抽象通知者Subject类

      当观察者发生变化,通过Notify接口通知所有观察者。避免直接的实现,降低耦合。

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

抽象观察者Observers类

当得到主题通知时,调用Update。称为更新接口

abstract class  Observer    {        public abstract void Update();    }    abstract class Subject

具体观察者concreteObserver类

     实现抽象观察者的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 );        }    }


      客户端


static void Main(string[] args)        {            ConcreteSubject a = new ConcreteSubject();            a.Attach(new ConcreteObserver (a,"b"));            a.SubjectState = "状态a";            a.Notify();            Console.Read();        }