设计模式之美:Observer(观察者)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了设计模式之美:Observer(观察者),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2736字,纯文字阅读大概需要4分钟。
内容图文
索引
- Dependency
- Publish-Subscribe
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.
Subject
- Subject 知道它的 Observer。可以有任意多个 Observer 观察同一个 Subject。
- 提供注册和删除 Observer 的接口。
Observer
- 为那些在 Subject 发生改变时需要获得通知的对象定义一个 Update 接口。
ConcreteSubject
- 将有关状态存储各个 ConcreteObserver 对象。
- 当它的状态发生改变时,想它的各个 Observer 发出通知。
ConcreteObserver
- 维护一个指向 ConcreteSubject 对象的引用。
- 存储有关状态,这些状态应该与 ConcreteSubject 的状态保持一致。
- 实现 Observer 的更新接口以使自身状态与 ConcreteSubject 状态保持一致。
在以下情况下可以使用 Observer 模式:
- 当一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
- 当对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变。
- 当一个对象必须通知其他对象,而它又不能假定其他对象时谁。
- 目标与观察者间的抽象耦合。
- 支持广播通信。
- 意外的更新。因为 Observer 并不知道其他 Observer 的存在,所以对改变 Subject 的最终代价一无所知。
- 可以使用 Mediator 模式封装复杂的更新语义,充当 Subject 与 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>(); 1112publicvoid Attach(Observer observer) 13 { 14 _observers.Add(observer); 15 } 1617publicvoid Detach(Observer observer) 18 { 19 _observers.Remove(observer); 20 } 2122publicvoid Notify() 23 { 24foreach (var observer in _observers) 25 { 26 observer.Update(); 27 } 28 } 29 } 3031publicclass ConcreteSubject : Subject 32 { 33privatestring _state; 3435publicstring State 36 { 37get38 { 39return _state; 40 } 41set42 { 43 _state = value; 44 Notify(); 45 } 46 } 47 } 4849publicclass ConcreteObserver : Observer 50 { 51private ConcreteSubject _subject; 5253public ConcreteObserver(string name, ConcreteSubject subject) 54 { 55 Name = name; 56 _subject = subject; 57 } 5859publicstring Name { get; privateset; } 6061publicoverridevoid Update() 62 { 63string subjectState = _subject.State; 64 Console.WriteLine(Name + ": " + subjectState); 65 } 66 } 6768publicclass Client 69 { 70publicvoid TestCase1() 71 { 72var 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)); 7677 subject.State = "Hello World"; 78 } 79 } 80 }
《设计模式之美》为 Dennis Gao 发布于博客园的系列文章,任何未经作者本人同意的人为或爬虫转载均为耍流氓。
原文:http://www.cnblogs.com/gaochundong/p/design_pattern_observer.html
内容总结
以上是互联网集市为您收集整理的设计模式之美:Observer(观察者)全部内容,希望文章能够帮你解决设计模式之美:Observer(观察者)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。