1.观察者模式又叫做发布-订阅模式。
2.观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
3.使用观察者模式的好处:维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便。
什么时候使用观察者模式:当一个对象的改变需要同时改变其他对象的时候,而且它不知道具体有多少对象有待改变时,应该考虑使用观察者模式。
private static void Main(string[] args) { Boss boss = new Boss(); boss.Update += new StockObserver("股票哥", boss).CloseStockMarket; boss.Update += new NBAObserver("NBA哥", boss).CloseNBADirectSeeding; boss.SubjectState = "老板回来了。。。"; boss.Notify(); } /// <summary> /// 通知者接口 /// </summary> public interface ISubject { void Notify(); string SubjectState { get; set; } } public delegate void EventHandler(); public class Boss : ISubject { public event EventHandler Update; public void Notify() { if (Update != null) { Update(); } } public string SubjectState { get; set; } } /// <summary> /// 前台秘书类 /// </summary> public class Secretary : ISubject { public event EventHandler Update; public void Notify() { if (Update != null) { Update(); } } public string SubjectState { get; set; } } /// <summary> /// 看股票的同事 /// </summary> public class StockObserver { private string name; private ISubject subject; public StockObserver(string name, ISubject subject) { this.name = name; this.subject = subject; } public void CloseStockMarket() { Console.WriteLine("{0} {1} 关闭股票行情,继续工作!", subject.SubjectState, name); } } /// <summary> /// 看NBA的同事 /// </summary> public class NBAObserver { private string name; private ISubject subject; public NBAObserver(string name, ISubject subject) { this.name = name; this.subject = subject; } public void CloseNBADirectSeeding() { Console.WriteLine("{0} {1} 关闭NBA直播,继续工作!", subject.SubjectState, name); } }