0
点赞
收藏
分享

微信扫一扫

java设计模式--事件监听器模式和观察者模式


监听器模式:事件源经过事件的封装传给监听器,当事件源触发事件后,监听器接收到事件对象可以回调事件的方法

观察者模式:观察者(Observer)相当于事件监听者,被观察者(Observable)相当于事件源和事件,执行逻辑时通知observer即可触发oberver的update,同时可传被观察者和参数

 

监听器模式demo

1、首要定义事件源对象(事件源相当于单击按钮事件当中的按钮对象、属于被监听者):

 



 

1. public class DemoSource {     
2. private Vector repository = new Vector();//监听自己的监听器队列     
3. public DemoSource(){}     
4. public void addDemoListener(DemoListener dl) {     
5.            repository.addElement(dl);     
6.     }     
7. public void notifyDemoEvent() {//通知所有的监听器     
8. enum = repository.elements();     
9. while(enum.hasMoreElements()) {     
10. enum.nextElement();     
11. new DemoEvent(this));     
12.            }     
13.     }     
14. }



2、其次定义事件(状态)对象(该事件对象包装了事件源对象、作为参数传递给监听器、很薄的一层包装类):

 

 


 


1. public class DemoEvent extends java.util.EventObject {     
2. public DemoEvent(Object source) {     
3. super(source);//source—事件源对象—如在界面上发生的点击按钮事件中的按钮     
4. //所有 Event 在构造时都引用了对象 "source",在逻辑上认为该对象是最初发生有关 Event 的对象     
5.     }     
6. public void say() {     
7. "This is say method...");     
8.     }     
9. }

3、最后定义我们的事件侦听器接口如下

 

 


 

1. public interface DemoListener extends java.util.EventListener {     
2. //EventListener是所有事件侦听器接口必须扩展的标记接口、因为它是无内容的标记接口、     
3. //所以事件处理方法由我们自己声明如下:     
4. public void handleEvent(DemoEvent dm);     
5. }



监听器实现类

 

 



1. public class DemoListener1 implements DemoListener {     
2. public void handleEvent(DemoEvent de) {     
3. "Inside listener1...");     
4. //回调     
5.        }     
6. }



4、测试代码

 

 



 


1. public class TestDemo {     
2.    DemoSource ds;     
3. public TestDemo(){     
4. try{     
5. new DemoSource();     
6. //将监听器在事件源对象中登记:     
7. new DemoListener1();     
8.          ds.addDemoListener(listener1);     
9. new DemoListener() {     
10. public void handleEvent(DemoEvent event) {     
11. "Method come from 匿名类...");     
12.           }     
13.         });     
14. //触发事件、通知监听器     
15. catch(Exception ex){  
16.        ex.printStackTrace();  
17.        }     
18.     }     
19.     
20. public static void main(String args[]) {     
21. new TestDemo();     
22.     }     
23. }


观察者模式demo

观察者

 



 

1. class Watcher implements java.util.Observer {     
2. public void update(java.util.Observable obj, Object arg) {     
3. "Update() called, count is "      
4.                                 + ((Integer) arg).intValue());     
5. }     
6. }


被观察者

 

 



 


1. class BeingWatched extends java.util.Observable {     
2. void counter(int period) {     
3. for(; period>=0; period-- ) {     
4.                 setChanged();     
5. new Integer(period));     
6. try {     
7. 100);     
8. catch( InterruptedException e) {     
9. "Sleep interrupeted" );     
10.                 }     
11.         }     
12. }     
13. };

   



测试

 

 




1. public class ObserverDemo {     
2. public static void main(String[] args) {     
3. new BeingWatched();//受查者     
4. new Watcher();//观察者     
5.         beingWatched.addObserver(watcher);     
6. 10);     
7.     }     
8. }


查阅了一些相关的东东 
原来这两种api可以说都是基于:订阅-发布模式的事件/消息通知模式,二者应该都算是“推”方式吧,就是被监控者将消息通知给所有监控者。 
1、订阅:Observable.addObserver; 
事件源.addDemoListener(这个方法是自己定义的)。 

2、发布:Observable需要两步:setChanged()、notifyObservers(newValue); 
事件源.notifyDemoEvent()(这个方法也是自己定义的)。

举报

相关推荐

0 条评论