观察者模式 -- 大话设计模式
在今天,读书有时是件“麻烦”事。它需要你付出时间,付出精力,还要付出一份心境。--仅以《大话设计模式》来祭奠那逝去的……
观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象发生变化时,会通知到所有观察者对象,使它们能自动更新自己
1.观察者模式应用
定义抽象通知者(主题)和抽象观察者,抽象通知者负责增加、移除和通知抽象观察者,抽象观察者得到通知的时候更新自己
/// <summary> /// 主题或者抽象通知者 /// </summary> public abstract class Subject { private IList<Observer> observers = new List<Observer>(); /// <summary> /// 增加观察者 /// </summary> public void Attach(Observer observer) { observers.Add(observer); } /// <summary> /// 移除观察者 /// </summary> /// <param name="observer"></param> public void Detach(Observer observer) { observers.Remove(observer); } /// <summary> /// 通知观察者 /// </summary> public void Notify() { foreach (var v in observers) { v.Update(); } } } /// <summary> /// 抽象观察者(为所有具体观察者定义的一个接口,在得到主题通知时更新自己) /// </summary> public abstract class Observer { public abstract void Update(); }
定义具体通知者(主题)和具体观察者,具体观察者实现具体业务
/// <summary> /// 具体主题或者通知者 /// </summary> public class ConcreteSubject : Subject { public string SubjectState { get; set; } } /// <summary> /// 具体观察者 /// </summary> public class ConcreteObserver : Observer { private string _name; public ConcreteSubject Subject { get; set; } public ConcreteObserver(ConcreteSubject subject, string name) { this._name = name; this.Subject = subject; } public override void Update() { Console.WriteLine("观察者{0}:通知者发来最新消息【{1}】", this._name, this.Subject.SubjectState); } }
开启场景模拟
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(); }