【设计模式】——观察者模式
2016-02-15 11:06
295 查看
基本介绍:
观察者模式:又叫做发布-订阅(publish/subscribe)模式。定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。观察者模式中,对象间的相互耦合关系越弱越好,这样发生改变的时候才不至于互相影响。在其中目标和观察者不是紧密耦合的,他们可以属于一个系统中的不同抽象层次,目标所知道的仅仅是他有一系列的观察者,每个观察者实现observer的简单接口,观察者具体属于哪个类,目标是不知道的。UML结构图:
观察者模式例子:
//subject类,可以翻译为主题或抽象统治者,一般用一个抽象类或者一个接口实现。他把所有的观察者对象的引用保存在一个聚集里,每个主题都可以有任何数量的观察者,抽象主题提供一个接口,可以增加删除观察者。 abstract class Subject { private IList<Observer> observers = new List<Observer>(); //增加观察者 public void Attach(Observer observer) { observers.Add(observer); } //移除观察者 public void Detach(Observer observer) { observers.Remove(observer); } //通知 public void Notify() { foreach (Observer o in observers) o.Update(); } } //observer类,抽象观潮者,为所有的具体观察者定义一个接口,在得到主题的通知时更新自己。这个接口叫做更新接口,抽象观察者一般用一个抽象类或者一个接口实现。更新接口通常包含一个update方法,这个方法叫做更新方法 abstract class Observer { public abstract void Update(); } //concretesubject类,叫做具体主题或者具体通知者,将有关状态存入具体观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知,具体主题角色通常用一个具体子类实现。 class ConcreteSubject:Subject { private string subjectState; //具体被观察者状态 public string SubjectState { get {return subjectState ;} set {subjectState=value ;} } } //concreteobserver类,具体观察者,实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。具体观察者角色可以保存一个指向主题对象的引用。具体观察者角色通常用一个具体子类实现。 class ConcreteObserver:Observer { private string name; private string observerState; private ConcreteSubject subject; public ConcreteObserver (ConcreteSubject subject,string name) { this.subject=subject; this.name=name; } public override void Update() { observerState=subject.SubjectState ; Console.WriteLine("观察者{0}的新状态是{1}",name,observerState ); } public ConcreteSubject Subject { get{return subject ;} set{subject =value;} } }客户端代码:
static void Main(string[] args) { ConcreteSubject s = new ConcreteSubject(); s.Attach(new ConcreteObserver(s, "X")); s.Attach(new ConcreteObserver(s, "Y")); s.Attach(new ConcreteObserver(s, "Z")); s.SubjectState = "ABC"; s.Notify(); Console.Read(); }
观察者模式特点:
1、应用:当一个对象的改变需要同时改变其他对象时。而且它不知道具体有多少对象有待改变时。2、一个抽象模型有两方面,其中一方面依赖于另一方面,这时用观察者模式可以将这两者独立的对象中使他们各自对地改变和复用。
3、主要工作解耦,让耦合的双方都依赖与抽象,而不是依赖具体。从而使得各自的变化都不会影响另一边的变化。
相关文章推荐
- Html+Css 纯CSS实现的导航 (精通CSS高级WEB解决方案)读书笔记
- MVC 4.0 定义路由
- 陈绮贞 旅行的意义 Ukulele 尤克里里谱
- java调用python方法总结
- QT 学习网址
- ftp命令行下,为什么不能上传目录?
- Android 解决65535的限制 使用android-support-multidex解决Dex超出方法数的限制问题,让你的应用不再爆棚
- 360某站点MySQL注射(附验证脚本)
- 照片框架PhotoKit
- Android 性能优化 TraceView工具的使用
- C# WInform 界面左导航菜单
- 一键分享
- music
- mac 无法连接到WIFI问题解决方案
- Java 多态
- Moq测试基础说谈(一)——简介,下载
- PHP的try catch
- linux sort,uniq,cut,wc命令详解
- crash定位
- iOS 上的相机捕捉