设计模式(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
原创粉丝点击