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