`

设计模式之观察者模式之源-监听器(Source/Listener)模式

 
阅读更多

观察者模式 源-监听器(Source/Listener)模式
     事件监听器模式重要的三个概念:事件+事件监听器+事件源

$("#div").addEventListener("click",function(event){});
     事件源:$("#div") 即id = div的html元素
     事件:click事件对应的对象
     事件监听器:function(event){ } 匿名函数

 

Button button = new Button();
button.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent actionEvent){ //当触发事件时,执行代码 } });
事件源:Button组件
事件:click事件对应的对象 ActionEvent
事件监听器:ActionListener接口中的actionPerformed方法
 
事件监听的过程如下:
1、事件源通常会有很多事件类型,比如点击类型,加载类型,关闭类型等等。此时,事件源就会添加这些个事件对应的事件监听器。
2、事件监听器的作用就是:当事件源的某个事件被触发时,就会调用这个事件对应的事件监听器的处理事件的方法。

  • 初始化事件源类,事件监听器所在的类(实现接口EventListener)事件类(继承EventObject类)
  • 对于每一个事件,都分为更为具体的事件(如点击事件,分为双击和单击。加载事件,分为开始加载,成功加载,加载异常,关闭页面等事件)。点击事件对应ClickEvent,其种类可以分为DoubleClick和SingleClick事件(通常使用ClickEvent类的类常量表示)。而ClickEvent事件则对应ClickEventListener事件监听器,更为具体的DoubleClick事件对应ClickEventListener事件的doubleClick方法,而SingleClick事件对应ClickEventListener事件的singleClick方法。
  • 确认要触发的事件,实例化事件类,ClickEvent,并且赋值其成员变量,是赋值其为DoubleClick还是SingleClick。
  • 当事件源触发click事件的时候,通过条件判断(if-else/switch-case),则会使用ClickEventListener事件监听器。接下来继续判断click事件的类型和种类,如果是DoubleClick事件,则调用ClickEventListener类的doubleClick方法。如果是SingleClick事件,则调用ClickEventListener类的singleClick方法。


 定义一个事件源:Page页面。事件源至少有两个方法,一个是为自身添加事件监听器,一个是触发事件方法。当触发事件时,会根据传入的事件获取事件类型。从而确定应该实例化哪一个事件监听器类,并且调用事件监听器的哪一个方法可能                     


1、事件。一般继承自java.util.EventObject类,封装了事件源对象及跟事件相关的信息。

/**
 * 定义事件(状态)对象(该事件对象包装了事件源对象、作为参数传递给监听器、很薄的一层包装类):
 * 所有 Event 在构造时都引用了对象 "source",在逻辑上认为该对象是最初发生有关 Event 的**对象
 */
public interface Event {
    public void show();
}


//source—事件源对象—如在界面上发生的点击按钮事件中的按钮
//所有 Event 在构造时都引用了对象 "source",在逻辑上认为该对象是最初发生有关 Event
 // 的对象  不管是click事件还是double click事件都会发生在按钮之上

public class EventImplement  extends EventObject implements Event {
    private EventSource source ;

    public EventImplement(EventSource source){
        super(source);
    }
    @Override
    public void show() {
        System.out.println();
    }
}





事件监听器。实现java.util.EventListener接口,注册在事件源上,当事件源的属性或状态改变时,取得相应的监听器调用其内部的回调方法。

/**
 * EventListener 代表不同的行为
 * 如果不同的行为只需要添加不同的 EventListener 即可
 * 事件的监听者,当事件被触发,所有监听这个事件的监听者将被通知,
    然后执行自己的Action    响应动作。
 *listener得到事件并进行处理
 */
public interface EventListener {
    void onEvent(Event e);
}

/**
 * 单击事件
 */
public class EventListenerImplement1 implements EventListener {
    @Override
    public void onEvent(Event e) {
        System.out.println("single click event");
        e.show();//回调
    }
}

/**
 * 双击事件
 */
public class EventListenerImplement2 implements EventListener {
    @Override
    public void onEvent(Event e) {
        System.out.println("double click event");
        e.show();
    }
}




事件源。事件发生的地方,由于事件源的某项属性或状态发生了改变(比如BUTTON被单击、TEXTBOX的值发生改变等等)导致某项事件发生。换句话说就是生成了相应的事件对象。因为事件监听器要注册在事件源上,所以事件源类中应该要有盛装监听器的容器(List,Set等等)。

/**
 * 被监听者的事件集合,可能是方法,提供事件的注册加入和移除功能。
 * source生产事件并分发
 * eventSource应该实现EventListener的onEvent方法
 */
public interface EventSource {
    public void registerListener(EventListener e);
    public void notifyEvent();
}

public class EventSourceImplement implements EventSource {

    private Vector repository = new Vector();//监听自己的监听器队列

    @Override
    public void registerListener(EventListener e) {
        repository.add(e);
    }

    //通知所有的监听器:直接调用对象里缓存repository的listener对象的onEvent方法,
   //这样就把Event对象分发出去了
    @Override
    public void notifyEvent() {
        Enumeration enums = repository.elements();

        while(enums.hasMoreElements()) {
            EventListener el = (EventListener)enums.nextElement();
            el.onEvent(new EventImplement(this));
        }
    }
}



public class Test {
    public static void main(String[] args){
        EventSource source = new EventSourceImplement();
        EventListener click = new EventListenerImplement1();
        EventListener doubleClick = new EventListenerImplement2();

        source.registerListener(click);
        source.registerListener(doubleClick);

        source.notifyEvent();
    }
}



public class SafeListener {

    private final EventListener listener;

    private SafeListener() {
        listener = new EventListener() {
            public void onEvent(Event e) {
                e.show();
                doSomething(e);
            }
        };
    }

    void doSomething(Event e) {
    }

    public static SafeListener newInstance(EventSource source) {
        SafeListener safe = new SafeListener();
        source.registerListener(safe.listener);
        return safe;
    }

   public static void main(String[] args){
       EventSource source = new EventSourceImplement();
       SafeListener safeListener = SafeListener.newInstance(source);
       source.notifyEvent();
   }
}



事件源:组件,例如Button 
事件对象:event,例如MouseEvent类的对象 事件监听接口:EventListener,例如MouseListener 
EventListener 接口是处理事件的主要方法。用户实现 EventListener 接口,并使用 AddEventListener 方法在 EventTarget 上注册其侦听器。用户还应该在使用完侦听器后从其 EventTarget 移除 EventListener。 
MouseListener用于接收组件上“感兴趣”的鼠标事件(按下、释放、单击、进入或离开)的侦听器接口。(要跟踪鼠标移动和鼠标拖动,请使用 MouseMotionListener。)  
 旨在处理鼠标事件的类要么实现此接口(及其包含的所有方法),要么扩展抽象类 MouseAdapter(仅重写所需的方法)。  
 然后使用组件的 addMouseListener 方法将从该类所创建的侦听器对象向该组件注册。当按下、释放或单击(按下并释放)鼠标时会生成鼠标事件。鼠标光标进入或离开组件时也会生成鼠标事件。发生鼠标事件时,将调用该侦听器对象中的相应方法,并将 MouseEvent 传递给该方法。

 

  • 大小: 143.5 KB
  • 大小: 7.8 KB
  • 大小: 141.6 KB
分享到:
评论

相关推荐

    Java 观察者模式的浅析

    Java 观察者模式的浅析 ... 观察者(Observer)模式是对象的行为型模式,又叫做发表-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-收听者(Source/Listener)模式或从属者(Dependents)模式。

    观察者模式

    观察者设计模式观察者模式(有时又被称为发布-订阅<Publish/Subscribe>模式、模型-视图<Model/View>模式、源-收听者<Source/Listener>模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有...

    设计模式系列之观察者模式

    观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件...

    JavaWeb开发技术-Listener监听器.pptx

    Listener监听器 JavaBean Servlet Jsp XML HTML JAVA WEB开发技术 Listener监听器 事件监听器用于对程序中发生的事件进行监听,在监听的过程中会涉及几个重要组成部分: 事件(Event) 事件源 事件处理器 事件监听器...

    观察者模式的一个应用

    观察者模式(有时又被称为模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。...

    C++设计模式之观察者模式(Observer)

    观察者模式通常的叫法叫做订阅-发布模式,类似于报刊杂志的订阅,观察者和被观察者就是读者和邮局的关系,读者先要在邮局订阅想要的报刊,当报刊发行时,邮局会将报刊邮寄到读者家里。观察者(Observer)和被观察者...

    java 设计模式 观察者 源码

    观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件...

    23-Listener-源代码.rar

    案例-使用监听器完成定时生日祝福、,一、监听器Listener 二、邮箱服务器。 1.什么是监听器? 2.监听器有哪些? 3.监听三大域对象的创建与销毁的监听器 4.监听三大域对象的属性变化的 5.与session中的绑定的...

    ssh框架的搭建

    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- Listener log4jConfigLocation --> <listener> <listener-class>org.springframework.web....

    spring和hibernate整合

    在web.Xml中<context-param> <param-name>contextConfigLocation</param-name> ... <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> </listener>

    listener监听器demo

    listener监听器小例子

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

    java实现观察者设计模式,利用ApplicationListener和ApplicationEvent。Test包里有测试代码

    SpringBoot ApplicationListener观察者模式示例

    1. 发布订阅/观察者模型,...3.对解耦代码有很大的帮助,比如多种业务场景做完都要插入通知消息,每个场景代码在做完业务逻辑,直接发布一个对应的事件,让监听器去处理监听逻辑即可,而不需要每个场景都加这一段代码。

    java程序访问sap.rar

    // Windows listener //------------------------------------------------------------ addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { if (mConnection != null) JCO...

    openstack-barbican-keystone-listener-9.0.0-1.el8.noarch.rpm

    官方离线安装包,亲测可用

    学习php设计模式 php实现观察者模式(Observer)

    又称为发布-订阅(Publish-Subscribe)模式、模型-视图(Model-View)模式、源-监听(Source-Listener)模式、或从属者(Dependents)模式 二、观察者模式结构图   三、观察者模式中主要角色 抽象主题(Subject)...

    PHP设计模式之观察者模式(Observer)详细介绍和代码实例

    当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新【GOF95】 又称为发布-订阅(Publish-Subscribe)模式、模型-视图(Model-View)模式、源-监听(Source-Listener)模式、或从属者(Dependents...

    logback-ext-spring

    spring使用logback的扩展,使用起来非常方便。在web.xml中配置: ... <listener-class>ch.qos.logback.ext.spring.web.LogbackConfigListener</listener-class> </listener> 即可加载logback配置,使用logback。

    Spring MVC 框架应用实例

    <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <filter-name>encodingFilter</filter-name> <filter-class> org.spring...

Global site tag (gtag.js) - Google Analytics