标签:
UML类图:
举一个生活中的例子:假如一个写字楼的员工定了外卖。是定外卖的人每10分钟就到楼下转一圈儿看外卖到了。还是送外卖的小哥一个个工位的送过去?
都不是。
实际上外卖小哥到了写字楼楼下给每个员工打电话,员工就会下楼拿着自己外卖上楼。
实际上,这就是一个观察者模式。外卖小哥到写字楼楼下--》自己的状态改变了---》通过手机通知所有的观察者
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题。这个主题对象发生变化时,会通知所有观察者对象,使他们能够自动更新自己。
Notify函数,这个函数可以调用所有observer的update函数,来更新自己的状态。
/// <summary> /// 抽象主题类 /// </summary> public abstract class Subject { private IList<Observer> observers = new List<Observer>(); /// <summary> /// 增加观察者 /// </summary> /// <param name="observer"></param> 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 (Observer o in observers) { o.Update(); } } } /// <summary> /// 抽象观察者类,为所有具体观察者定义一个接口,在得到通知时更新自己 /// </summary> public abstract class Observer { public abstract void Update(); } /// <summary> /// 具体观察者或具体通知者,将有关状态存入具体观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常用一个具体子类实现。 /// </summary> public class ConcreteSubject : Subject { private string subjectState; /// <summary> /// 具体观察者的状态 /// </summary> public string SubjectState { get { return subjectState; } set { subjectState = value; } } } /// <summary> /// 具体观察者,实现抽象观察者角色所要求的更新接口,已是本身状态与主题状态相协调 /// </summary> public class ConcreteObserver : Observer { private string observerState; private string name; private ConcreteSubject subject; /// <summary> /// 具体观察者用一个具体主题来实现 /// </summary> public ConcreteSubject Subject { get { return subject; } set { subject = value; } } public ConcreteObserver(ConcreteSubject subject, string name) { this.subject = subject; this.name = name; } /// <summary> /// 实现抽象观察者中的更新操作 /// </summary> public override void Update() { observerState = subject.SubjectState; Console.WriteLine("The observer‘s state of {0} is {1}", name, observerState); } }
客户端:
class Program { static void Main(string[] args) { // 具体主题角色通常用具体自来来实现 ConcreteSubject subject = new ConcreteSubject(); subject.Attach(new ConcreteObserver(subject, "Observer A")); subject.Attach(new ConcreteObserver(subject, "Observer B")); subject.Attach(new ConcreteObserver(subject, "Observer C")); subject.SubjectState = "Ready"; subject.Notify(); Console.Read(); } }
标签:
原文地址:http://www.cnblogs.com/LUO77/p/5785472.html