观察者模式

来源:互联网 发布:mac os yosemite 多大 编辑:程序博客网 时间:2024/06/03 06:25

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。

这个主题对象在状态上发生变化时,会通知所有观察者对象,让它们能够自动更新自己。

首先定义一个接口,负责对被观察者对象的属性更新

package com.test.observer;/** * 被观察的对象接口 * @author yuewen * */// 抽象观察者角色public interface ObserveTest {public void update(String str);}


接下来定义一个主题角色的接口,提供对观察者的增加,删除,已经通知观察者

package com.test.observer;/** * 主题角色的接口,在其中声明方法(添加、移除观察者,通知观察者)需要被主题观察者继承: *  * @author yuewen * */public interface Observerd {public void addObServerd(ObserveTest o);public void removeObServer(ObserveTest o);public void notifyWatchers(String str);}
被观察者,实现ObserverTest接口中更新属性的方法

package com.test.observer;/** * 观察者 *  * @author yuewen * */public class Wachter implements ObserveTest {@Overridepublic void update(String str) {System.out.println(str);}}
主题角色,也正是负责观察对象已经通知被观察者对象的负责人,需要实现Observed的接口

package com.test.observer;import java.util.ArrayList;import java.util.List;/** * 主题角色,负责存放被观察的对象以及更新对象的属性 *  * @author yuewen * */public class Conceter implements Observerd {// 存放需要观察的对象private List<ObserveTest> obServedObject = new ArrayList<ObserveTest>();@Overridepublic void addObServerd(ObserveTest o) {obServedObject.add(o);}@Overridepublic void removeObServer(ObserveTest o) {obServedObject.remove(o);}/** * 该方法是核心,遍历所有的观察者依依更新观察者的属性,入参则是需要被观察对象需要更新的属性 */@Overridepublic void notifyWatchers(String str) {if (!obServedObject.isEmpty() && !str.isEmpty() && str.trim() != "") {// 如果发生改变,则遍历存放观察者对象的信息并更新for (ObserveTest o : obServedObject) {// 更新对象o.update(str);}}}}
测试类

package com.test.observer;/** * 测试类 *  * @author yuewen * */public class MainTest {public static void main(String args[]) {// 被观察的对象1ObserveTest o1 = new Wachter();// 被观察对象2ObserveTest o2 = new Wachter();// 定义被观察的对象1的方法输出结果o1.update("hello");// 定义被观察的对象2的方法输出结果o2.update("world");// 主题角色,负责管理被观察者Conceter con = new Conceter();con.addObServerd(o1);con.addObServerd(o2);// 通知观察者,并改变原来对象的方法修改con.notifyWatchers("all changed");}}

结果如下:




0 0
原创粉丝点击