1 概念
观察者设计模式是对象的行为模式,又叫做发布-订阅模式、模型-视图模式,源-监听器模式或从属者模式
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态上发生变化时,会通知所有观察者对象,使他们能够自动更新自己。
2 观察者模式的结构
抽象主题(Subject)角色:主题角色把所有观察者对象的引用保存在一个聚集(比如Vector对象)里,每个主题都可以有任何数量的观察者。抽象主题提供:所有观察者的集合(observers),增加(attach)和删除(detach)观察者方法、通知观察者(notifyObservers)的方法,主题角色又叫做抽象被观察者,一般用一个抽象类或者一个接口实现。
抽象观察者(Observer)角色:为所有的具体观察者定义一个接口,在得到主题的通知时更新自己,这个接口叫做更新接口,抽象观察者一般用一个抽象类或者一个接口来实现,如图所示,更新接口中只有一个update方法,这个方法叫做更新方法。
具体主题方(ConcreteSubject)角色:将所有关联状态存入具体观察者对象,在具体主题的内部状态(state)改变时,给所有登记过的观察者发出通知。具体主题角色又叫做具体被观察者角色,具体主题角色通常用一个具体子类实现,它既有抽象主题的成员变量vector(所有观察该主题的集合),还实现了attach(增加观察者)、detach(删除观察者)、notifyObservers(通知观察者)方法,并且自己还定义了一个change(改变状态)方法,state(状态)变量。
具体观察者(ConcreteObserver)角色:它实现了抽象观察者所要求的接口,以便在主题状态发生改变时通知观察者。主题与观察者是一个合成关系,在主题角色中的Vector中可以有多个观察者接口(Observer),在具体主题中是不知道Observer的具体类型的,这就使得具体主题对象可以动态的维护一系列的对象观察者对象引用,并且在特定的时候调用每一个观察者共有的update方法。
3 观察者设计模式的demo
3.1 定义一个抽象主题接口subject
/** * 抽象主题(Subject)角色 * @author Mrliu * */ public interface Subject { public Vector<Observer> observerVector = new Vector<Observer>(); public void attach(Observer observer); public void detach(Observer observer); public void notifyObservers(); }
3.2 定义一个实现ConcreateSubject类,它实现了Subject接口
package com.liuyu.subject; import com.liuyu.observer.Observer; public class ConcreateSubject implements Subject { private boolean state; // 添加观察者(订阅) @Override public void attach(Observer observer) { observerVector.add(observer); } // 删除观察者(取消订阅) @Override public void detach(Observer observer) { if (observer != null && observerVector.contains(observer)) { observerVector.remove(observer); } } // 通知所有观察者,调用更新方法 @Override public void notifyObservers() { for (Observer observer : observerVector) { observer.update(); } } // 主题状态发生改变,通知所有观察者,调用更新方法 public void changeState(boolean state) { if (state) { this.notifyObservers(); } } public boolean isState() { return state; } public void setState(boolean state) { this.state = state; } }
3.3 定义了一个抽象观察者对象,Observer接口
package com.liuyu.observer; /** * 抽象观察者(Observer)角色 * @author Mrliu * */ public interface Observer { public void update(); }
3.4 定义个ConcreateObserver(具体观察者对象),它实现了Observer接口
package com.liuyu.observer; /** * 具体观察者(ConcreteObserver)角色 * * @author Mrliu * */ public class ConcreateObserver implements Observer { private String observerName; public ConcreateObserver() {} public ConcreateObserver(String observerName) { super(); this.observerName = observerName; } @Override public void update() { System.out.println("==== "+ observerName +"update ===="); } public String getObserverName() { return observerName; } public void setObserverName(String observerName) { this.observerName = observerName; } }
3.5 编写一个主函数,生成一个主题和2个观察者(订阅者)对象,然后调用主题的changeState方法
package com.liuyu.main; import com.liuyu.observer.ConcreateObserver; import com.liuyu.subject.ConcreateSubject; public class TestDemo { public static void main(String[] args){ ConcreateSubject subject = new ConcreateSubject(); subject.attach(new ConcreateObserver("观察者一")); subject.attach(new ConcreateObserver("观察者二")); subject.changeState(true); } }
生活中运用的场景:大家都知道消息推送,我们在App客户端设置了允许推送后,当有新闻更新后,消息服务器(Suject)就会把新闻推送给客户端(observer),而没有设置允许推送的客户端是收不到推送过来的消息的。
4 观察者的效果
4.1观察者的优点
(1) 观察则模式在被观察者和观察者之间建立一个抽象的耦合。被观察者角色所知道的只是一个具体观察者聚合,每一个具体观察者都符合一个抽象观察则的接口,被观察者并不认识任何一个具体观察者,它只知道他们又一个共同的接口。这样被观察者和观察者就不会紧密地耦合到一起。
(2) 观察者模式支持广播通讯。被观察者会向所有的登记过的观察者发出通知
4.2观察者模式有以下缺点
(1) 如果一个被观察者有很多观察者的话,将所有的观察者通知到会花费很多时间
(2) 如果被观察者之间有循环依赖的话,被观察者会触发他们之间进行循环的调用,导致崩溃,在使用观察者模式时,特别要注意这一点。
(3) 如果对观察者的通知时通过另外的线程进行异步投递的话,系统必须保证投递是以合适的方式进行的。
(4) 虽然观察者模式可以随时使观察者知道所观察的对象发生了变化,但是观察者模式没有相应的机制使观察者知道所有的对象是怎么发生改变的。
相关推荐
Java设计模式——观察者模式的两种情况。
简单易懂的观察者模式
对应的博客链接:http://blog.csdn.net/t1234xy4/article/details/52432559#
浅析Java设计模式【1】——观察者!
《Android 设计模式:(二)观察者模式 —— 让你的对象知悉现况》 示例代码
《Android 设计模式:(一)观察者模式 —— 封装行为的大局观》示例代码
从生活中的例子可以看出,只要对订阅号... 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己的行为。
KWIC 程序示例 事件风格 观察者模式的程序代码,使用的是Java语言。
5.7 OBSERVER(观察者)—对象行为型 模式 194 5.8 STATE(状态)—对象行为型模式 201 5.9 STRATEGY(策略)—对象行为型 模式 208 5.10 TEMPLATE METHOD(模板方法) —类行为型模式 214 5.11 VISITOR(访问者)—...
NULL 博文链接:https://quicker.iteye.com/blog/605988
对象间的联动——观察者模式,处理对象的多种状态及其相互转换——状态模式,算法的封装与切换——策略模式,模板方法模式深度解析,操作复杂对象结构——访问者模式,设计模式与足球,多人联机射击游戏中的设计模式...
NULL 博文链接:https://quicker.iteye.com/blog/604969
C#设计模式(23种设计模式) 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype) 结构型: 6. 适配器...
《java设计模式》课后习题及模拟试题答案
设计模式精解(Design Patterns Explained) ...如何实现关键模式——Strategy(策略)、Observer(观察者)、Bridge(桥接)、Decorator(装饰)等等。 共同点/变化点分析、设计模式以及它们如何帮助理解抽象类。
本文来自51cto,文章主要介绍了策略模式、观察者模式、装饰模式、单例模式以及饿汉模式等的相关内容。泛化=实现>组合>聚合>关联>依赖一个人(Person)可以买车(car)和房子(House),那么就可以称:Person类依赖于Car类...
本书从一个新的视角描述面向对象设计,将...\r\n 如何实现关键模式——Strategy(策略)、Observer(观察者)、Bridge(桥接)、Decorator(装饰)等等。\r\n 共同点/变化点分析、设计模式以及它们如何帮助理解抽象类。
撤销功能的实现——备忘录模式(三) 撤销功能的实现——备忘录模式(四) 撤销功能的实现——备忘录模式(五) 观察者模式-Observer Pattern 对象间的联动——观察者模式(一) 对象间的联动——观察者模式(二) ...
目录: 前 言 第一部分 大旗不挥,谁敢冲锋——热身篇 第1章 单一职责原则 1.1 我是“牛”类,我可以担任多职吗 1.2 绝杀技,打破你的传统思维 1.3 我单纯,所以我快乐 1.4 最佳实践 ...附录:23个设计模式