设计模式(19)------观察者模式
来源:互联网 发布:男子遭遇网络诈骗 编辑:程序博客网 时间:2024/06/05 09:09
观察者模式作用:
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,
所有依赖于它的对象都得到通知,并且自动更新。
应用场景:
(1)当一个抽象模型有两个方面,其中一个方面依赖于另一方面,将二者封装到独立的对象中,
以使他们可以独自的改变和复用。
(2)当一个对象的改变需要同时改变其它对象,而不知道具体有多少对象等待改变。
(3)当一个对象必须通知其它对象,而它又不能假定其它对象是谁。
参与对象:
(1)Subject
目标知道其观察者。可以有任意多个观察者观察同一个目标,提供注册和删除观察对象的接口。
(2)Observer
为哪些在目标发生改变时需要获得的对象定义一个更新的接口。
(3)ConcreteSubject
将有关对象存入ConcreteObserver中,当其对象发生改变时,向观察者发出通知。
(4)ConcreteObserver
维护一个指向ConcreteSubject对象的引用。存储有关状态,这些状态应该与Subject对象状态保持一致,
实现Observer接口的具体更新,使得自身状态与Subject对象状态保持一致。
例如,老百姓(Subject)知道自己被警察观察着,可以有一个或多个警察(Observer),当老百姓出现状况时,
可以通过(ConcreteSubjec,打110t)向警察(Observer)发出通知,警察接到(ConcreteObserver)老百姓的
电话时,根据老百姓的描述,酌情处理,决定是否要出警。
eg:
Subject
package com.lanhuigu.base.design.behavior.observer;import java.util.ArrayList;import java.util.List;/** * Citizen: 目标知道其观察者。可以有任意多个观察者观察同一个目标,提供注册和删除观察对象的接口。 */public abstract class Citizen {List pols;String help = "normal";public List getPols() {return pols;}public void setPols(List pols) {this.pols = pols;}public String getHelp() {return help;}public void setHelp(String help) {this.help = help;}abstract void sendMessage(String help);public void setPolicemen() {this.pols = new ArrayList();}public void register(Policeman pol) {this.pols.add(pol);}public void unRegister(Policeman pol) {this.pols.remove(pol);}}
Observer
package com.lanhuigu.base.design.behavior.observer;/** * Observer: 为哪些在目标发生改变时需要获得的对象定义一个更新的接口。 */public interface Policeman {void action(Citizen ci);}
ConcreteSubject
package com.lanhuigu.base.design.behavior.observer;/** * ConcreteCitizen: 将有关对象存入ConcreteObserver中,当其对象发生改变时,向观察者发出通知。 */public class BeiJingCitizen extends Citizen {public BeiJingCitizen(Policeman pol) {// TODO Auto-generated constructor stubsetPolicemen();register(pol);}@Overridevoid sendMessage(String help) {// TODO Auto-generated method stubsetHelp(help);for (int i=0;i<pols.size();i++) {Policeman pol = (Policeman) pols.get(i);pol.action(this);}}}
ConcreteObserver
package com.lanhuigu.base.design.behavior.observer;/** * ConcreteObserver: 维护一个指向ConcreteSubject对象的引用。存储有关状态,这些状态应该与Subject对象状态保持一致, */public class BeijingPoliceman implements Policeman {@Overridepublic void action(Citizen ci) {// TODO Auto-generated method stubString help = ci.getHelp();if (help.equals("normal")) {System.out.println("一切正常,不用出动");} else {System.out.println("有犯罪行为,马上出动");}}}
Client
<span style="color:#000000;">package com.lanhuigu.base.design.behavior.observer;public class Test {public static void main(String[] args) {Policeman hpPol = new BeijingPoliceman();Citizen ci = new BeiJingCitizen(hpPol);ci.sendMessage("normal");}}</span>
运行结果:
0 0
- 设计模式(19)------观察者模式
- 设计模式(19)-观察者模式
- 设计模式(19)--观察者模式
- 设计模式(观察者模式)
- 设计模式,行为模式(观察者模式)
- 设计模式--观察者(监听)设计模式
- 设计模式(一)观察者设计模式
- 设计模式--观察者(监听)设计模式
- 模式设计:观察者模式
- 设计模式-----观察者模式
- 设计模式-观察者模式
- 设计模式--观察者模式
- 设计模式:观察者模式
- 设计模式-----观察者模式
- 设计模式:观察者模式
- 设计模式-观察者模式
- 设计模式 观察者模式
- 设计模式-观察者模式
- 设计模式(16)------迭代器模式
- 设计模式(17)------中介者模式
- 这只是一个测试博客Visual Studio Ultimate 2013,vs2013.5_ult_chs.iso,vs2013.5_ult_enu.iso
- Hi3516A开发--ethtool安装和使用
- 设计模式(18)------备忘录模式
- 设计模式(19)------观察者模式
- Robot Framework自动化测试--安装篇
- hdu 5551/Huatuo's Medicine
- CVPR2016目标检测新进展
- Python实现最小二乘法
- 构建高性能web之路------mysql读写分离实战
- Activity的生命周期测试
- Hadoop 数据节点DataNode异常
- openvswitch的原理和常用命令