`

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设计模式-第22章-观察者模式.ppt

    Java设计模式中的观察者模式(Observer Pattern)是一种对象行为型模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式常用于事件处理和实时...

    设计模式-观察者

    例如,当用户在网页上点击按钮时,按钮作为被观察者,会触发一系列事件,这些事件的监听器(观察者)会接收到通知并执行相应的操作,如弹出对话框、刷新页面等。 6. **优缺点**:优点是实现了对象间的抽象耦合,...

    java设计模式-图解-附代码

    ### Java设计模式详解 #### 创建型模式 **1.1 工厂方法(Factory Method)** 工厂方法模式定义了一个创建对象的接口,但允许子类决定实例化哪一个类。这使得一个类的实例化可以被推迟到其子类。这种模式在以下...

    java中监听机制,以及观察者设计模式

    Java中的监听机制与观察者设计模式是编程中重要的概念,它们在软件开发中扮演着关键的角色,尤其是在构建可扩展和可维护的系统时。这里,我们将深入探讨这两个主题,并通过实例来阐述它们的工作原理和应用。 首先,...

    观察者模式java实现观察者设计模式

    在Java中,我们可以利用Java提供的内置监听器机制来实现观察者模式,例如`ApplicationListener`和`ApplicationEvent`,这两个类主要用于Swing或JavaFX应用程序中的事件处理。 首先,我们来看`ApplicationListener`...

    java23种设计模式之观察者模式

    **观察者模式(Observer Pattern)**是软件设计模式中的一种行为模式,它在Java中有着广泛的应用。这个模式的核心思想是“一对多”的依赖关系,即一个主题对象(Subject)可以被多个观察者(Observer)关注,当主题...

    HeadFirst 设计模式学习笔记2--观察者模式 demo

    例如,在Web开发中,可以使用观察者模式处理用户交互事件,当用户触发某个操作时,相关的监听器(观察者)会得到通知并执行相应的逻辑。 总的来说,HeadFirst设计模式的学习笔记2关于观察者模式的演示,旨在帮助...

    java的设计模式 《设计模式-java语言中的应用.pdf》

    以上就是Java设计模式的一些基本概念和应用,理解并熟练掌握这些模式对于编写高质量、易于维护的Java代码至关重要。通过阅读《设计模式——Java语言中的应用》这本书,你可以更深入地学习和掌握这些模式的细节及其在...

    Java设计模式刘伟书本中模拟考试答案

    在很多场景下,观察者模式用于实现事件监听和事件处理机制。 6. 里氏代换原则(Liskov Substitution Principle)和迪米特法则(Law of Demeter): 里氏代换原则是面向对象设计原则之一,它指出在软件中,如果类S是...

    设计模式:观察者模式java和javabean

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动的编程...

    java设计模式 课件讲义

    "Java设计模式和源码"这门课程可能涵盖了以上所有模式的理论和实际应用。通过学习,你可以理解每个模式的核心思想,以及如何在实际项目中有效地应用它们。源码部分则提供了具体的实现示例,帮助你更好地理解和掌握...

    Java设计模式的教学PPT和源代码

    这个压缩包包含了一份关于Java设计模式的教学PPT和相应的源代码,是进行Java设计模式学习的理想资源。 首先,让我们深入了解一下设计模式的基本概念。设计模式并不直接提供代码实现,而是描述在特定情况下,如何...

    设计模式-java

    根据提供的文件信息,本书《设计模式 For Dummies》是一本介绍设计模式的通俗易懂的指南,适合初学者以及希望深入了解面向对象编程中设计模式应用的开发者。下面将基于此书的内容来概述几种常见的设计模式及其应用...

    JAVA设计模式配套光盘

    Java设计模式是软件工程中的一种最佳实践,它们是解决常见编程问题的经验总结,旨在提高代码的可重用性、可维护性和可扩展性。在这个"JAVA设计模式配套光盘"中,我们可以期待找到一系列关于Java设计模式的资源,包括...

    观察者模式在Java事件处理中的应用研究.pdf

    本文将深入分析观察者模式的组成部分和应用场景,并探讨Java事件处理机制的原理,以及事件源、事件、监听器与观察者设计模式中各角色的对应关系。 观察者模式的组成部分包括被观察者(Subject)和观察者(Observer...

    观察者模式Vs事件委托Demo

    在编程领域,观察者模式(Observer Pattern)和事件委托(Event Delegation)是两种常见的设计模式,它们在处理对象间的交互和通信时起到关键作用。本文将深入探讨这两种模式的概念、工作原理及其在Java中的应用。 ...

    java设计模式(观察者模式)

    观察者设计模式是软件开发中的一种常见模式,它在Java中得到了很好的支持。该模式定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在Java中,这个模式通常...

    Java的23种设计模式百度云下载链接.rar

    Java的23种设计模式是软件工程中非常重要的概念,它们是...以上是Java中23种设计模式的基本介绍,每一种模式都有其特定的适用场景,理解和熟练掌握这些设计模式,能够帮助开发者编写出更加灵活、可维护和可扩展的代码。

    Java 设计模式.zip

    Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决常见问题的经验总结和最佳实践。这个开源项目"Java 设计模式.zip"显然是一个Java编程语言实现的设计模式集合,旨在帮助开发者理解和应用这些模式。...

    java监听器练习

    Java中的监听器机制是基于观察者模式的设计模式之一,广泛应用于图形用户界面(GUI)应用程序中。 #### 二、监听器的基本组成部分 监听器通常包括以下几个部分: 1. **事件源(Event Source)**:触发事件的对象,如...

Global site tag (gtag.js) - Google Analytics