标题:observer观察者模式


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


1,抽象主题(Subject):它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。

2,具体主题(ConcreteSubject):将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。

3,抽象观察者(Observer):为所有的具体观察者定义一个接口,在得到主题通知时更新自己。

4,具体观察者(ConcreteObserver):实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调。

 

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

            }

        }

    }

 

 

    public abstract class Observer

    {

        public abstract void Update();

    }

 

 

    public class ConcreteSubject : Subject

    {

        private string subjectState;

 

        public string SubjectState

        {

            get { return subjectState; }

            set { subjectState = value; }

        }

    }

 

    public class ConcreteObserver : Observer

    {

        private string observerState;

        private string name;

        private ConcreteSubject subject;

 

        public ConcreteSubject Subject

        {

            get { return subject; }

            set { subject = value; }

        }

 

        public ConcreteObserver(ConcreteSubject subject, string name)

        {

            this.subject = subject;

            this.name = name;

        }

 

        public override void Update()

        {

            observerState = subject.SubjectState;

            Console.WriteLine("The observer's state of {0} is {1}", name, observerState);

        }

    }

 

    int  main(void)

    {

            // 具体主题角色通常用具体自来来实现

            ConcreteSubject subject = new ConcreteSubject();

 

            subject.Attach(new ConcreteObserver(subject, "Observer A"));

            subject.Attach(new ConcreteObserver(subject, "Observer B"));

            subject.Attach(new ConcreteObserver(subject, "Observer C"));

 

            subject.SubjectState = "Ready";

            subject.Notify();

 

    }



看文字不过瘾?点击我,进入周哥教IT视频教学
麦洛科菲长期致力于IT安全技术的推广与普及,我们更专业!我们的学员已经广泛就职于BAT360等各大IT互联网公司。详情请参考我们的 业界反馈 《周哥教IT.C语言深学活用》视频

我们的微信公众号,敬请关注