`

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

阅读更多

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

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

 

监听器模式demo

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

 

[java] view plaincopy
 
  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.            Enumeration enum = repository.elements();     
  9.            while(enum.hasMoreElements()) {     
  10.                    DemoListener dl = (DemoListener)enum.nextElement();     
  11.                  dl.handleEvent(new DemoEvent(this));     
  12.            }     
  13.     }     
  14. }    


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

 

 

[java] view plaincopy
 
  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.            System.out.println("This is say method...");     
  8.     }     
  9. }    

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

 

 

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

监听器实现类

 

 

[java] view plaincopy
 
  1. public class DemoListener1 implements DemoListener {     
  2.        public void handleEvent(DemoEvent de) {     
  3.               System.out.println("Inside listener1...");     
  4.               de.say();//回调     
  5.        }     
  6. }   

4、测试代码

 

 

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

观察者模式demo

观察者

 

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


被观察者

 

 

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


测试

 

 

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

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

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

分享到:
评论

相关推荐

    java事件监听模式实现万能事件总线.zip

    Java简单几个类实现万能事件总线,采用享元模式和监听器模式。 使用方法很简单,直接EventCenter.get().addListener(key,()->{...你的代码快...});就行, 无论在哪,只要执行EventCenter.get().sendMessage(key,...

    java监听器demo

    一个java监听器的实现demo,即观察者设计模式实现

    【动力节点】Javaweb开发视频教程之监听器

    其中包括观察者设计模式、监听器设计模式。第二部分为监听器用法。详细讲解了Servlet相关的八大监听器,并通过两个实际项目应用综合演示了它们的用法。 北京动力节点-05监听器专题-001-设计模式分类北京动力节点-05...

    观察者模式高级应用

    附件是个观察者模式高级应用地demo,实现了事件分发机制,例如当创建一个新用户后,发送创建用户地事件,事件总线里面有对创建用户地事件监听地监听器就会得到相应地执行,比较适合那种当一个对象改变状态,依赖它的...

    java观察者模式实现和java观察者模式演化

    观察者模式是经典设计模式中很常用的一种,平常我们看到的监听器,基本上都是采用这种设计模式实现的,这里探讨一下观察者模式的演化

    做好的事件监听器1

    做好的事件监听器1

    design-pattern-forjava.zip

    design-pattern-forjava 基于java版的设计模式实现。 1,抽象工厂模式,提供一个创建一系列相关或互相依赖对象的接口,而无需指定他们具体的类. 2,适配器模式:将一个类的接口转换成客户希望的另外一个接口.Adapter...

    JAVA画图形学程序的设计与实现.rar

    考虑使用设计模式,如命令模式、观察者模式等,简化程序的设计和实现。 通过以上设计与实现,Java 画图形学程序可以提供一个简单但功能丰富的绘图工具,满足用户绘制各种图形的需求,并为用户提供良好的使用体验。

    Android UI组件实例集合

    GifAction.java 观察者类,监视GIF是否加载成功 GifFrame.java 里面三个成员:当前图片、延时、下张Frame的链接。 GifDecoder.java 解码线程类 GifView.java 主类,包括常用方法,如GifView构造方法、设置图片源、...

    ORACLE9i_优化设计与系统调整

    §6.1.1 系统设计阶段和开发阶段的优化 85 §6.1.2 改善产品系统的优化 85 §6.2 优化的优先步骤 86 §6.2.1 步骤1:优化商业规则 86 §6.2.2 步骤2:优化数据设计 87 §6.2.3 步骤3:优化应用程序设计 87 §6.2.4 ...

Global site tag (gtag.js) - Google Analytics