Java Observer 观察者模式 程序 总结
2016-05-09 15:09
429 查看
观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
public class:
抽象主题角色类
抽象观察者角色类
具体观察者角色类
抽象事件类
配置properties文件
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
public class:
package com.observer; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Properties; public class MainTest { public static void main(String[] args) { Child c = new Child(); Properties props = new Properties(); try { props.load(MainTest.class.getClassLoader().getResourceAsStream("observer.properties")); } catch (IOException e) { e.printStackTrace(); } String []observers = props.getProperty("observers").split(","); for(String s : observers) { try { c.addWakenUpListener((WakenUpListener) Class.forName(s).newInstance()); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } new Thread(c).start(); } }
抽象主题角色类
package com.observer; import java.util.ArrayList; import java.util.List; /** * 一个主题对象,主题对象状态发生变化时,会通知所有观察者 * @author IRON_MAN * */ class Child implements Runnable { /** * 把所有观察者对象的引用保存在List中 */ private List<WakenUpListener> wakenUpListeners = new ArrayList<WakenUpListener>(); /** * 保存添加观察者对象 * @param wakenUpListener */ public void addWakenUpListener(WakenUpListener wakenUpListener) { wakenUpListeners.add(wakenUpListener); } /** * 通知所有观察者对象 */ void wakeUp() { System.out.println("wake"); for(int i = 0; i < wakenUpListeners.size(); i++) { WakenUpListener wakenUpListener = wakenUpListeners.get(i); wakenUpListener.actionToWakenUp(new WakenUpEvent(System.currentTimeMillis(), "a", this)); } } @Override public void run() { try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } this.wakeUp(); } }
抽象观察者角色类
package com.observer; public interface WakenUpListener { public void actionToWakenUp(WakenUpEvent wakeUpEvent); }
具体观察者角色类
package com.observer; /** * 观察者Dad,可自动更新自己 * @author IRON_MAN * */ class Dad implements WakenUpListener { public void actionToWakenUp(WakenUpEvent wakenUpEvent) { System.out.println("feed"); } }
package com.observer; /** * 观察者GrandFather * @author IRON_MAN * */ class GrandFather implements WakenUpListener { public void actionToWakenUp(WakenUpEvent wakeUpEvent) { System.out.println("hug"); } }
抽象事件类
package com.observer; class WakenUpEvent { private long time; private String loc; private Child source; public WakenUpEvent(long time, String loc, Child source) { super(); this.time = time; this.loc = loc; this.source = source; } public long getTime() { return time; } public String getLoc() { return loc; } public Child getSource() { return source; } public void setTime(long time) { this.time = time; } public void setLoc(String loc) { this.loc = loc; } public void setSource(Child source) { this.source = source; } }
配置properties文件
observers=com.observer.Dad,com.observer.GrandFather
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树