设计模式之观察者模式

10/25/2012 10:23:51 AM

名称:观察者模式

意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它 的对象的都得到通知并被自动更新。

适用环境:

     1、当一个抽象模型有两个方面,其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。

     2、当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变。

     3、当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之,你不希望这些对象是紧密耦合的。

    abstractclassSubjectO

    {

        privateList<Observer> _observers = newList<Observer>();

        publicvoidAttach(Observerobserver)

        {

            _observers.Add(observer);

        }

        publicvoidDetach(Observerobserver)

        {

            _observers.Remove(observer);

        }

        publicvoidNotify()

        {

            foreach(Observero in_observers)

            {

                o.Update();

            }

        }

    }

    classConcreteSubject: SubjectO

    {

        privatestring_subjectState;

        publicstringSubjectState

        {

            get{ return_subjectState; }

            set{ _subjectState = value; }

        }

    }

 

    abstractclassObserver

    {

        publicabstractvoidUpdate();

    }

    classConcreteObserver: Observer

    {

        privatestring_name;

        privatestring_observerState;

        privateConcreteSubject_subject;

        publicConcreteObserver(ConcreteSubjectsubject, stringname)

        {

            this._subject = subject;

            this._name = name;

        }

        publicoverridevoidUpdate()

        {

            _observerState = _subject.SubjectState;

            Console.WriteLine("Observer {0}'s new state is {1}",

                _name, _observerState);

        }

        publicConcreteSubjectSubject

        {

            get{ return_subject; }

            set{ _subject = value; }

        }

}

调用:

            ConcreteSubjects = newConcreteSubject();

            s.Attach(newConcreteObserver(s, "X"));

            s.Attach(newConcreteObserver(s, "Y"));

            s.Attach(newConcreteObserver(s, "Z"));

 

            s.SubjectState = "ABC";

            s.Notify();

 

输出:

Observer X's new state is ABC

Observer Y's new state is ABC

Observer Z's new state is ABC