观察者模式又称为发布—订阅模式、模型—视图模式、源-监听器模式或从属者(dependents)模式,是一种对象的行为型模式。它定义了对象之间的一种一对多的依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象都得到通知并被自动更新。观察者模式的优点在于实现了表示层和数据层的分离,并定义了稳定的更新消息传递机制,类别清晰,抽象了更新接口,使得相同的数据层可以有各种不同的表示层。
优点:
1)抽象了主体与Observer之间的耦合关系。
2)支持广播方式的通信。
使用场景:
1)对一个对象的修改涉及对其它对象的修改,而且不知道有多少对象需要进行相应修改。
2)对象应该能够在不用假设对象标识的前提下通知其它对象。
public interface Observer { void Update(Subject subject); }
public interface Subject { void Attach(Observer docExplorer); void Detach(Observer docExplorer); void NotifyObservers(); }
public class DocExplorer : Observer { public void Update(Subject subject) { Console.WriteLine("更新DocExplorer自身的状态"); } }
/// <summary> /// 公文类 /// </summary> public class OfficeDoc : Subject { //存储与OfficeDoc相关联的DocExplorer对象 private IList<Observer> observerList = new List<Observer>(); /// <summary> /// 将某DocExplorer对象与OfficeDoc相关联 /// </summary> /// <param name="docExplorer"></param> public void Attach(Observer docExplorer) { observerList.Add(docExplorer); } /// <summary> /// 解除某DocExplorer对象与OfficeDoc的关联关系 /// </summary> /// <param name="docExplorer"></param> public void Detach(Observer docExplorer) { observerList.Remove(docExplorer); } /// <summary> /// 通知所有的DocExplorer对象 /// </summary> public void NotifyObservers() { IEnumerator enumeration = observerList.GetEnumerator(); while (enumeration.MoveNext()) { Observer observer = enumeration.Current as Observer; observer.Update(this); } } }
class Program { static void Main(string[] args) { //观察者设计模式 Subject subject = new OfficeDoc(); Observer doc = new DocExplorer(); subject.Attach(doc); subject.Attach(doc); subject.Attach(doc); subject.NotifyObservers(); } }