索引
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.
Subject
Observer
ConcreteSubject
ConcreteObserver
在以下情况下可以使用 Observer 模式:
下面的交互图描述 Subject 与 Observer 之间的协作:
推模式(Push Model):Subject 向 Observer 发送关于改变的详细信息,而不管它们是否需要。
拉模式(Pull Model):Subject 除最小通知外什么也不推送,由 Observer 显式地向 Subject 询问细节。
1 namespace ObserverPattern.Implementation1 2 { 3 public abstract class Observer 4 { 5 public abstract void Update(); 6 } 7 8 public abstract class Subject 9 { 10 private List<Observer> _observers = new List<Observer>(); 11 12 public void Attach(Observer observer) 13 { 14 _observers.Add(observer); 15 } 16 17 public void Detach(Observer observer) 18 { 19 _observers.Remove(observer); 20 } 21 22 public void Notify() 23 { 24 foreach (var observer in _observers) 25 { 26 observer.Update(); 27 } 28 } 29 } 30 31 public class ConcreteSubject : Subject 32 { 33 private string _state; 34 35 public string State 36 { 37 get 38 { 39 return _state; 40 } 41 set 42 { 43 _state = value; 44 Notify(); 45 } 46 } 47 } 48 49 public class ConcreteObserver : Observer 50 { 51 private ConcreteSubject _subject; 52 53 public ConcreteObserver(string name, ConcreteSubject subject) 54 { 55 Name = name; 56 _subject = subject; 57 } 58 59 public string Name { get; private set; } 60 61 public override void Update() 62 { 63 string subjectState = _subject.State; 64 Console.WriteLine(Name + ": " + subjectState); 65 } 66 } 67 68 public class Client 69 { 70 public void TestCase1() 71 { 72 var subject = new ConcreteSubject(); 73 subject.Attach(new ConcreteObserver("Observer 1", subject)); 74 subject.Attach(new ConcreteObserver("Observer 2", subject)); 75 subject.Attach(new ConcreteObserver("Observer 3", subject)); 76 77 subject.State = "Hello World"; 78 } 79 } 80 }
《设计模式之美》为 Dennis Gao 发布于博客园的系列文章,任何未经作者本人同意的人为或爬虫转载均为耍流氓。
设计模式之美:Observer(观察者),布布扣,bubuko.com
原文:http://www.cnblogs.com/gaochundong/p/design_pattern_observer.html