设计模式----观察者模式

        今天,我们来讲讲观察者模式。。所谓观察者模式就是一种观察者的模式(哈哈),其实观察者模式就一句话:对象和行为分离。。如果你理解了这句话,观察者模式你就学会了,怎么样,是不是特别简单。。额,如果不理解的话请看以下代码。。

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

        首先,观察者模式,当然不能少了观察者,Observer类就是我们抽象出来的观察者,它只有一个方法Update,然后呢,前面我们不是说了吗,观察者模式核心就是对象和行为分离,既然对象有了,那么行为也该出场了啊。。

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

         Subject类就是我们的通知者,也就是我们所说的被观察者,它有三个方法和一个list集合,Attach方法就是往集合中添加观察对象,Detach方法就是往集合中减除观察对象,而Notify方法是执行所有被观察对象的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; }
        }
    }



class ConcreteSubject : Subject
    {
        private string subjectState;

        //具体被观察者状态
        public string SubjectState
        {
            get { return subjectState; }
            set { subjectState = value; }
        }
    }

        我们首先看ConcreteObserver类,它继承Observer类,所以它是具体观察者,然后我们看ConcreteSubject类,它继承Subject类,所以它是具体通知者。。我们接着看他们内部,首先是ConcreteSubject类,它只有一个属性SubjectState,然后我们看ConcreteObserver类,首先是构造函数,它注入了具体通知者和name,然后重写Update方法,修改修改自身状态。好了,观察者模式就写完了,现在,让我们来通过上层使用来全局看看是如何运转的

 class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("***********观察者模式************");
            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();
        }
    }

        首先是new一个通知者,然后通知者添加观察对象(它得知道有多少人在偷看它对吧),所有观察者模式还有一个别名叫发布--订阅模式。ConcreteSubject就是发布者,ConcreteObserver就是订阅者,好,接下来我们就看看实现运行效果如何。。。

        这里我们可以看到当我们改变发布者状态的时候,所有的观察者状态都得到了改变。。这样我们的目的也就达到了,当我发布东西的时候,我需要通知所有订阅我的人我的状态。。。

        对象和行为分离:所有的观察者和通知者之间没有必然的联系,观察者只负责观察(也就是订阅),改变行为通知观察者交给通知者统一管理。这就是我们今天的观察者模式了。。。

 

posted @ 2019-04-27 20:16  守望阳光01  阅读(403)  评论(0编辑  收藏  举报