java设计模式--事件监听器模式和观察者模式
2013-04-08 11:18
567 查看
监听器模式:事件源经过事件的封装传给监听器,当事件源触发事件后,监听器接收到事件对象可以回调事件的方法
观察者模式:观察者(Observer)相当于事件监听者,被观察者(Observable)相当于事件源和事件,执行逻辑时通知observer即可触发oberver的update,同时可传被观察者和参数
监听器模式demo
1、首要定义事件源对象(事件源相当于单击按钮事件当中的按钮对象、属于被监听者):
2、其次定义事件(状态)对象(该事件对象包装了事件源对象、作为参数传递给监听器、很薄的一层包装类):
观察者模式demo
观察者
被观察者
测试
原来这两种api可以说都是基于:订阅-发布模式的事件/消息通知模式,二者应该都算是“推”方式吧,就是被监控者将消息通知给所有监控者。
1、订阅:Observable.addObserver;
事件源.addDemoListener(这个方法是自己定义的)。
2、发布:Observable需要两步:setChanged()、notifyObservers(newValue);
事件源.notifyDemoEvent()(这个方法也是自己定义的)。
观察者模式:观察者(Observer)相当于事件监听者,被观察者(Observable)相当于事件源和事件,执行逻辑时通知observer即可触发oberver的update,同时可传被观察者和参数
监听器模式demo
1、首要定义事件源对象(事件源相当于单击按钮事件当中的按钮对象、属于被监听者):
public class DemoSource { private Vector repository = new Vector();//监听自己的监听器队列 public DemoSource(){} public void addDemoListener(DemoListener dl) { repository.addElement(dl); } public void notifyDemoEvent() {//通知所有的监听器 Enumeration enum = repository.elements(); while(enum.hasMoreElements()) { DemoListener dl = (DemoListener)enum.nextElement(); dl.handleEvent(new DemoEvent(this)); } } }
2、其次定义事件(状态)对象(该事件对象包装了事件源对象、作为参数传递给监听器、很薄的一层包装类):
public class DemoEvent extends java.util.EventObject { public DemoEvent(Object source) { super(source);//source—事件源对象—如在界面上发生的点击按钮事件中的按钮 //所有 Event 在构造时都引用了对象 "source",在逻辑上认为该对象是最初发生有关 Event 的对象 } public void say() { System.out.println("This is say method..."); } }3、最后定义我们的事件侦听器接口如下
public interface DemoListener extends java.util.EventListener { //EventListener是所有事件侦听器接口必须扩展的标记接口、因为它是无内容的标记接口、 //所以事件处理方法由我们自己声明如下: public void handleEvent(DemoEvent dm); }监听器实现类
public class DemoListener1 implements DemoListener { public void handleEvent(DemoEvent de) { System.out.println("Inside listener1..."); de.say();//回调 } }4、测试代码
public class TestDemo { DemoSource ds; public TestDemo(){ try{ ds = new DemoSource(); //将监听器在事件源对象中登记: DemoListener1 listener1 = new DemoListener1(); ds.addDemoListener(listener1); ds.addDemoListener(new DemoListener() { public void handleEvent(DemoEvent event) { System.out.println("Method come from 匿名类..."); } }); ds.notifyDemoEvent();//触发事件、通知监听器 }catch(Exception ex){ ex.printStackTrace(); } } public static void main(String args[]) { new TestDemo(); } }
观察者模式demo
观察者
class Watcher implements java.util.Observer { public void update(java.util.Observable obj, Object arg) { System.out.println("Update() called, count is " + ((Integer) arg).intValue()); } }
被观察者
class BeingWatched extends java.util.Observable { void counter(int period) { for(; period>=0; period-- ) { setChanged(); notifyObservers(new Integer(period)); try { Thread.sleep(100); } catch( InterruptedException e) { System.out.println("Sleep interrupeted" ); } } } };
测试
public class ObserverDemo { public static void main(String[] args) { BeingWatched beingWatched = new BeingWatched();//受查者 Watcher watcher = new Watcher();//观察者 beingWatched.addObserver(watcher); beingWatched.counter(10); } }查阅了一些相关的东东
原来这两种api可以说都是基于:订阅-发布模式的事件/消息通知模式,二者应该都算是“推”方式吧,就是被监控者将消息通知给所有监控者。
1、订阅:Observable.addObserver;
事件源.addDemoListener(这个方法是自己定义的)。
2、发布:Observable需要两步:setChanged()、notifyObservers(newValue);
事件源.notifyDemoEvent()(这个方法也是自己定义的)。
相关文章推荐
- java设计模式--事件监听器模式和观察者模式
- java事件监听机制(观察者设计模式的实际运用)
- java设计模式--事件监听器模式和观察者模式
- 【设计模式】observer观察者模式:模拟java.awt.Button事件监听。
- 详解java的事件监听机制和观察者设计模式
- 观察者模式与事件监听器模式--java设计模式扫盲
- java设计模式--事件监听器模式和观察者模式
- java设计模式--事件监听器模式和观察者模式 .
- java设计模式--事件监听器模式和观察者模式
- Java设计模式补充:回调模式、事件监听器模式、观察者模式(转)
- 观察者设计模式 Vs 事件委托(java)
- Java设计模式之观察者模式的应用--简单的事件通知工具
- Java设计模式_行为型_观察者模式_任意行为的监听
- Java设计模式——观察者模式(事件监听)
- Java设计模式_观察者模式&事件处理机制
- Java设计模式——观察者模式(事件监听)
- 观察者设计模式 Vs 事件委托(java)
- java设计模式--观察者模式和事件监听器模式
- java设计模式--观察者模式和事件监听器模式
- 观察者设计模式 Vs 事件委托(java)