观察者模式(Observer):
指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
观察者模式的角色:
1)抽象目标(Subject):也叫抽象目标类,它提供了一个用于保存观察者对象的聚集类和增加、删除观察者对象的方法,以及通知所有观察者的抽象方法。
2)具体目标(ConcreteSubject):也叫具体目标类,它实现抽象目标中的通知方法,当具体主题的内部状态发生改变时,通知所有注册过的观察者对象。
3)抽象观察者(Observer):它是一个抽象类或接口,它包含了一个更新自己的抽象方法,当接到具体主题的更改通知时被调用。
4)具体观察者(ConcreteObserver):实现抽象观察者中定义的抽象方法,以便在得到目标的更改通知时更新自身的状态。
1 internal class Program 2 { 3 private static void Main(string[] args) 4 { 5 Subject subject = new ConcreteSubject(); 6 Observer observer1 = new ConcreteObserver1(); 7 Observer observer2 = new ConcreteObserver2(); 8 subject.Attach(observer1); 9 subject.Attach(observer2); 10 subject.Notify(); 11 } 12 } 13 14 /// <summary> 15 /// 抽象目标 16 /// </summary> 17 internal abstract class Subject 18 { 19 /// <summary> 20 /// 新增观察者 21 /// </summary> 22 /// <param name="o"></param> 23 public abstract void Attach(Observer o); 24 25 /// <summary> 26 /// 删除观察者 27 /// </summary> 28 /// <param name="o"></param> 29 public abstract void Detach(Observer o); 30 31 /// <summary> 32 /// 通知观察者 33 /// </summary> 34 public abstract void Notify(); 35 } 36 37 /// <summary> 38 /// 抽象观察者 39 /// </summary> 40 internal abstract class Observer 41 { 42 public abstract void update(); 43 } 44 45 /// <summary> 46 /// 具体目标 47 /// </summary> 48 internal class ConcreteSubject : Subject 49 { 50 private System.Collections.Generic.List<Observer> observers 51 = new System.Collections.Generic.List<Observer>(); 52 53 public override void Attach(Observer o) 54 { 55 if (o != null) 56 observers.Add(o); 57 } 58 59 public override void Detach(Observer o) 60 { 61 if (o != null) 62 observers.Remove(o); 63 } 64 65 public override void Notify() 66 { 67 Console.WriteLine("目标发生变化"); 68 foreach (var observer in observers) 69 { 70 observer.update(); 71 } 72 } 73 } 74 75 /// <summary> 76 /// 具体观察者1 77 /// </summary> 78 internal class ConcreteObserver1 : Observer 79 { 80 public override void update() 81 { 82 Console.WriteLine("观察者1更新"); 83 } 84 } 85 86 /// <summary> 87 /// 具体观察者2 88 /// </summary> 89 internal class ConcreteObserver2 : Observer 90 { 91 public override void update() 92 { 93 Console.WriteLine("观察者2更新"); 94 } 95 }
事例:
学校的“铃”是事件源和目标,"学生"是事件监听器和具体观察者,"铃声"是事件类。当下课时间到,会触发铃发声,这时会生成“铃声”事件;学生就会做一些事情。。。
1 internal class Program 2 { 3 private static void Main(string[] args) 4 { 5 // 创建下课铃声 6 Bell subject = new FinishClassBell(); 7 // 创建观察者 8 Observer xiaoming = new XiaoMing(); 9 Observer xiaohong = new XiaoHong(); 10 Observer xiaowang = new XiaoWang(); 11 // 观察者随着听着下课铃 12 subject.Attach(xiaoming); 13 subject.Attach(xiaohong); 14 subject.Attach(xiaowang); 15 // 下课铃响了,通知大家 16 subject.Notify(); 17 } 18 } 19 20 /// <summary> 21 /// 铃声:抽象目标 22 /// </summary> 23 internal abstract class Bell 24 { 25 /// <summary> 26 /// 新增观察者 27 /// </summary> 28 /// <param name="o"></param> 29 public abstract void Attach(Observer