今天咱们学习观察者模式,直接进入主题。
观察者模式又叫发布模-订阅(Publish/Subscribe)模式
定义了一种一对多的依赖关系,让多个观察对象同时观察某一个主题对象。这个主题在状态发生变化时会通知所有的观察者对象,使它们能够自动更新自己。
观察者模式组成
1.抽象主题(Subject类)提供抽象类或者一个接口实现。把所有对观察者对象的引用保存在一个聚集里,每个主题可以有任意数量的观察者。抽象主题提供了一个接口,可以增加和删除观察者对象.
2.抽象观察者(Observer)类为所有具体观察者定义一个接口,在得到主题时更新自己。这个接口叫做更新接口。抽象观察者用抽象类或者接口实现,更新接口包含一个更新方法(Update)。
3.具体主题(ConcreteSubject)类,存放具体观察者对象;在具体主题的内部状态改变时,给所有观察者发出通知。具体角色用具体子类实现。
4.具体观察者(ConcreteObserver)类,实现抽象观察者的更新接口,以便和主题状态协调,具体观察者用具体子类实现。
示例:
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(); } } } 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 ; 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;} } } static void Main(string[] args) { 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(); Console.Read(); }
总结:观察者模式所做的工作其实就是在解除耦合。让耦合的双方都依赖于抽象,而不是依赖于具体,从而使得各自的变化都不会影响另一边的变化。