观察者模式
2015-08-11 15:59
399 查看
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。
这个主题对象在状态上发生变化时,会通知所有观察者对象,让它们能够自动更新自己。
首先定义一个接口,负责对被观察者对象的属性更新
接下来定义一个主题角色的接口,提供对观察者的增加,删除,已经通知观察者
结果如下:
这个主题对象在状态上发生变化时,会通知所有观察者对象,让它们能够自动更新自己。
首先定义一个接口,负责对被观察者对象的属性更新
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 { @Override public 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>(); @Override public void addObServerd(ObserveTest o) { obServedObject.add(o); } @Override public void removeObServer(ObserveTest o) { obServedObject.remove(o); } /** * 该方法是核心,遍历所有的观察者依依更新观察者的属性,入参则是需要被观察对象需要更新的属性 */ @Override public 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[]) { // 被观察的对象1 ObserveTest o1 = new Wachter(); // 被观察对象2 ObserveTest 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"); } }
结果如下:
相关文章推荐
- foursquare url 令牌
- PostgreSQL一主两从实现及主从切换
- 智能指针的使用
- HDU 3572 Task Schedule(最大流-Dinic)
- listview滑动数据错乱
- Android项目中如何用好构建神器Gradle?
- 一个帖子学会Android开发四大组件
- gcc/g++使用简介
- C++ Primer 学习笔记_38_STL实践与分析(12)--集成的应用程序容器:文本查询程序
- 写给新手程序员的一封信
- Umbraco文档类型定义多个template
- Android项目中如何用好构建神器Gradle?
- Android项目中如何用好构建神器Gradle?
- 【机房收费系统】选择性查询数据库 及 限制特殊字符的输入
- msyql查看版本
- JMS 简单实例
- Android 自定义ImageView实现圆角/圆形 附加OnTouchListener详细注释以及Button圆角
- VMware linux 上网配置 虚拟机centos不能上网解决方案
- strsep
- iOS入门(十六)实例变量可见度和方法