Java设计模式之观察者模式
来源:互联网 发布:绝地求生游戏优化 编辑:程序博客网 时间:2024/05/28 23:11
参考:http://wwangcg.iteye.com/blog/1309952
观察者模式是对象的行为模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
Java的设计模式很多,观察者模式被称为是模式中的皇后,而且Java jdk也对它做了实现,可见该设计模式的重要位置。情形类似于评审们评审唱歌者,唱歌者唱歌的同时,通知评审者进行打分一系列操作。在图形化设计的软件中,为了实现视图和事件处理的分离,大多都采用了Observer模式,比如Java的Swing,Flex的ActionScript等。在现实的应用系统中也有好多应用,比如像当当网、京东商城一类的电子商务网站,如果你对某件商品比较关注,可以放到收藏架,那么当该商品降价时,系统给您发送手机短信或邮件。这就是观察者模式的一个典型应用,商品是被观察者,有的叫主体;关注该商品的客户就是观察者。下面的一个事例将模拟这个应用。
在java的util包中实现了该设计模式的框架,大部分应用都可以直接用它,当然了你也可以自己实现它,实际上就是一个被观察者的抽象类和一个观察者接口。被观察者的抽象类java.util.Observable。
package java.util;/** * 被观察者 */public class Observable { private boolean changed = false; //是否状态发生变化 private Vector obs; //当状态发生变化时,需要通知的观察者对象集合 //构造函数,默认初始化观察者对象集 public Observable() { obs = new Vector(); } /** * 添加观察者对象 * @param o 观察者对象 */ public synchronized void addObserver(Observer o) { if (o == null) throw new NullPointerException();if (!obs.contains(o)) { obs.addElement(o);} } /** * 删除一个指定的观察者 * @param o 观察者对象 */ public synchronized void deleteObserver(Observer o) { obs.removeElement(o); } /** * 通知观察者们 */ public void notifyObservers() { notifyObservers(null); } /** * 通知所有的观察者 * @param arg 传递的消息 */ 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; } /** * 是否有变更 * @return */ public synchronized boolean hasChanged() { return changed; } /** * 返回观察者数量 * @return */ public synchronized int countObservers() { return obs.size(); }}
观察者的接口java.util.Observer
package java.util;import java.util.Observable;/** * 观察者对象 */public interface Observer {/** * 根据被观察者的状态变更对应的处理方法 * @param o 被观察者对象 * @param arg 被观察者传递过来的参数 */ void update(Observable o, Object arg);}
模式的应用举例:
package com.liangbinny.observable;import java.util.Observable;/** * Observable 被观察者 */public class Subject extends Observable {/** * 业务处理方法 */public void doSomething() {if (true) {super.setChanged(); // 设置有变更}notifyObservers("我开始做事了..."); // 通知观察者做出处理}}
package com.liangbinny.observer;import java.util.Observable;import java.util.Observer;/** * 观察者一 * 被观察者通知观察者做事 */public class ObserverOne implements Observer{/** * 被观察者有操作时,通知观察者做出处理方法 * @param o 被观察者 * @param arg 被观察者处理业务操作传递给观察者的消息 */@Overridepublic void update(Observable o, Object arg) {System.out.println("观察者一对应做出处理,被观察者传递过来的消息为:"+arg);}}
package com.liangbinny.observer;import java.util.Observable;import java.util.Observer;/** * 观察者二 * 被观察者通知观察者做事 */public class ObserverTwo implements Observer{/** * 被观察者有操作时,通知观察者做出处理方法 * @param o 被观察者 * @param arg 被观察者处理业务操作传递给观察者的消息 */@Overridepublic void update(Observable o, Object arg) {System.out.println("观察者二对应做出处理,被观察者传递过来的消息为:"+arg);}}
测试Main方法:
package com.liangbinny;import com.liangbinny.observable.Subject;import com.liangbinny.observer.ObserverOne;import com.liangbinny.observer.ObserverTwo;public class TestObserverModel {public static void main(String[] args) {//创建被观察者Subject subject = new Subject();//创建观察者ObserverOne observerOne = new ObserverOne();ObserverTwo observerTwo = new ObserverTwo();//把两个观察者加到被观察者列表中subject.addObserver(observerOne);subject.addObserver(observerTwo);//观察者执行业务操作subject.doSomething();}}
打印结果:
观察者二对应做出处理,被观察者传递过来的消息为:我开始做事了...
观察者一对应做出处理,被观察者传递过来的消息为:我开始做事了...
0 0
- java设计模式之“观察者设计模式”
- Java设计模式之观察者设计模式
- 《java设计模式》之观察者设计模式
- Java设计模式之观察者
- Java设计模式之观察者
- Java设计模式之Observer(观察者)模式
- Java设计模式之Observer 观察者模式
- Java设计模式之Observer-观察者模式
- java 设计模式之二-观察者模式
- Java设计模式之观察者模式
- java设计模式之观察者模式
- java设计模式之观察者模式Observer
- java设计模式之观察者模式
- Java设计模式之观察者模式
- JAVA设计模式之观察者模式2
- java与设计模式之观察者模式
- Java--设计模式之观察者模式
- java设计模式之观察者模式
- 创世纪:spring之初(第二日)
- 给大家分享一本书
- Understanding OpenStack Authentication: Keystone PKI
- Neutron探讨 -- Openstack网络组件
- Hadoop系统化学习提纲
- Java设计模式之观察者模式
- MyEclipse修改jsp模板
- 【转】DB2 alter表字段
- Windows Azure计算服务-角色实例
- WinCE流驱动加载的控制
- 监听器简介+观察者模式
- Hadoop 集群如何选择合适的硬件
- Hadoop平民化
- Winform设置快捷键