java设计优化--观察者模式
2016-03-07 21:51
711 查看
观察者模式介绍
观察者模式是一种非常有用的设计模式,在软件系统中,当一个对象的行为依赖于另一个对象的状态时,观察者模式就非常有用。如果不适用观察者模式,而实现类似的功能,可能就需要另外启动一个线程不停地监听另一个对象的状态,这样会得不偿失。如果在一个复杂的系统中,可能就需要开启很多的线程来监听对象状态的变化,这样会使系统的性能产生额外的负担。而观察者模式就可以在单线程下使某一对象及时得知所依赖对象状态的变化而做出行为。
观察者模式的经典结构:
View Code
可以发现JDK中实现的观察者模式,用法简单功能强大,和我们上面写的观察者模式实现原理是一样的。观察者模式可以用于事件监听、通知发布等场合,可以确保观察者在不适用轮询监控的情况下,可以及时得到相关消息和事件。
观察者模式是一种非常有用的设计模式,在软件系统中,当一个对象的行为依赖于另一个对象的状态时,观察者模式就非常有用。如果不适用观察者模式,而实现类似的功能,可能就需要另外启动一个线程不停地监听另一个对象的状态,这样会得不偿失。如果在一个复杂的系统中,可能就需要开启很多的线程来监听对象状态的变化,这样会使系统的性能产生额外的负担。而观察者模式就可以在单线程下使某一对象及时得知所依赖对象状态的变化而做出行为。
观察者模式的经典结构:
public class Observable { private boolean changed = false;//判断观察对象是否发生变化 private Vector obs;//观察者队列 public Observable() { obs = new Vector(); } public synchronized void addObserver(Observer o) { if (o == null) throw new NullPointerException(); if (!obs.contains(o)) { obs.addElement(o); } } public synchronized void deleteObserver(Observer o) { obs.removeElement(o); } public void notifyObservers() { notifyObservers(null); } //通知观察者 public void notifyObservers(Object arg) { Object[] arrLocal; synchronized (this) { if (!changed) return; arrLocal = obs.toArray(); clearChanged(); } for (int i = arrLocal.length-1; i>=0; i--) ((Observer)arrLocal[i]).update(this, arg); } public synchronized void deleteObservers() { obs.removeAllElements(); } protected synchronized void setChanged() { changed = true; } protected synchronized void clearChanged() { changed = false; } public synchronized boolean hasChanged() { return changed; } public synchronized int countObservers() { return obs.size(); } }
View Code
可以发现JDK中实现的观察者模式,用法简单功能强大,和我们上面写的观察者模式实现原理是一样的。观察者模式可以用于事件监听、通知发布等场合,可以确保观察者在不适用轮询监控的情况下,可以及时得到相关消息和事件。
相关文章推荐
- Java正则表达式(1)
- java学习---复用类与多态(一)
- java7新特性 java8新特性
- Java多线程
- 3.6 java基础总结①反射
- java按位取反
- 【SpringMVC】<context:include-filter>和<context:exclude-filter>
- Java中的对象,包,类
- Java中“==”与equals方法的区别
- [疯狂Java]AWT:右键菜单
- spring的一个小例子(二)--解析前面的小例子
- java的static块执行时机
- Spring mvc+mybatis框架下的TooManyResultsException异常
- leetcode:Sum Root to Leaf Numbers 【Java】
- java第一周学习总结
- [JAVA · 初级]:6.特殊关键字:this
- javaWeb poi导入excel文件
- Java源码阅读之ArrayList
- 2016蓝桥杯假期任务之《翻硬币 》
- 《Java实战开发经典》第六章6.3