设计模式----观察者模式
今天,我们来讲讲观察者模式。。所谓观察者模式就是一种观察者的模式(哈哈),其实观察者模式就一句话:对象和行为分离。。如果你理解了这句话,观察者模式你就学会了,怎么样,是不是特别简单。。额,如果不理解的话请看以下代码。。
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就是订阅者,好,接下来我们就看看实现运行效果如何。。。
这里我们可以看到当我们改变发布者状态的时候,所有的观察者状态都得到了改变。。这样我们的目的也就达到了,当我发布东西的时候,我需要通知所有订阅我的人我的状态。。。
对象和行为分离:所有的观察者和通知者之间没有必然的联系,观察者只负责观察(也就是订阅),改变行为通知观察者交给通知者统一管理。这就是我们今天的观察者模式了。。。