以下内容仍在更新完善...
观察者模式
观察者模式是什么?
观察者模式定义一种一对多的依赖关系,让多个观察者对象同时观察一个主题对象。当主题对象发生相应状态变化是,会通知所有观察者对象并使观察者对象自动更新自己的状态。
因此,当一个对象的改变需要同时改变其他对象的时候,使用观察者模式方便简洁。
观察者模式的本质就是在解除耦合,让原本耦合的双方都依赖于抽象而不是依赖于具体,从而使得各自的变化都不会影响另一边的变化。即:具体观察者---抽象观察者,具体主题对象---抽象主题对象。具体对象继承抽象对象。
观察者模式结构图:
下面给出抽象类的代码示例(抽象主题和抽象观察者):
abstract class Subject //抽象主题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(); } } } abstract class Observer //抽象观察者类 { public abstract void Update(); }
下面给出具体类的代码示例(具体主题和具体观察者):
class ConcreteSubject : Subject //具体主题 { private string subjectState; //具体被观察者状态 public string SubjectState { get { return subjectState; } set { subjectState = value; } } } class ConcreteObserver : Observer //具体观察者 { private: string name; string observerState; ConcreteSubject subject; public: ConcretaObserver(ConcreteSubject subject, string name) { this.subject = subject; this.name = name; } override void Update() { observerState = subject.SubjectState; Console.WriteLine("观察者{0}的新状态是{1}",name,observerState); } ConcreteSubject Subject { get { return subject; } set { subject = value; } } }
客户端代码示例:
static void main(string[] args) { ConcreteSubject s = new ConcreteSubject(); s.Attach(new ConcreteObsetver(s,"X")); s.Attach(new ConcreteObsetver(s,"Y")); s.SubjectState = "ABC"; s.Notify(); console.Read(); } //结果显示: //观察者X的新状态是ABC //观察者Y的新状态是ABC