监听器模式

监听器模式其实是观察者模式中的一种,两者都有关于回调的设计。

与观察者模式不同的是,观察者模式中存在的角色为观察者(Observer)和被观察者(Observable)

而监听器模式中存在三种角色

  • 事件源(EventSource)
  • 事件对象(EventObject)
  • 事件监听器(EventListener)

简单的概述就是: 事件源经过事件的封装传给监听器,当事件源触发事件后,监听器接收到事件对象可以回调事件的方法

下面这张图可以很详细解释他们之间的关系

简单的实例

UML

@startuml
class EventSource{
- listeners: Vector<EventListener>
+ void addListener(EventListener listener)
+ void removeListener(EventListener listener)
+ void notifyListenerEvents(EventObject eventObject)
} class EventObject{
+ getSource(): Object
+ void:say() } interface EventListener{
+ void handleEvent(EventObject eventObject)
} class ConcreteEvetListenerA{
+ void handleEvent(EventObject eventObject)
}
class ConcreteEvetListenerB{
+ void handleEvent(EventObject eventObject)
} EventListener <-- ConcreteEvetListenerA
EventListener <-- ConcreteEvetListenerB EventObject --o EventListener EventSource -- EventObject
@enduml

事件源

public class DemoEventSource {

    /** 监听器列表 */
public Vector<DemoEventListener> listeners = new Vector<>(); /**
* 注册监听器
* @param listener EventListener
*/
public void addListener(DemoEventListener listener) {
listeners.add(listener);
} /**
* 撤销监听器
* @param listener EventListener
*/
public void removeListener(DemoEventListener listener) {
listeners.remove(listener);
} /**
* 通知所有监听器,包裹事件源成为事件
* @param eventObject EventObject
*/
public void notifyListenerEvents(EventObject eventObject){
listeners.forEach(listener ->{
listener.handleEvent(eventObject);
});
}
}

事件对象

public class DemoEventObject extends EventObject {

    /**
* Constructs a prototypical Event.
*
* @param source The object on which the Event initially occurred.
* @throws IllegalArgumentException if source is null.
*/
public DemoEventObject(Object source) {
super(source);
} /**
* 事件的回调或者业务逻辑
*/
public void say() {
System.out.println("this is " + this + " to say");
}
}

事件监听器

public interface DemoEventListener extends EventListener {

    /**
* 处理事件
* @param eventObject EventObject
*/
void handleEvent(EventObject eventObject);
} public class ConcreteEventListenerA implements DemoEventListener { @Override
public void handleEvent(EventObject eventObject) {
System.out.println("ConcreteEventListenerA accept eventObject , eventSource is : " + eventObject.getSource());
if (eventObject instanceof DemoEventObject) {
// 执行事件的回调函数/具体业务逻辑
((DemoEventObject) eventObject).say();
}
}
} public class ConcreteEventListenerB implements DemoEventListener { @Override
public void handleEvent(EventObject eventObject) {
System.out.println("ConcreteEventListenerB accept eventObject , eventSource is : " + eventObject.getSource()); if (eventObject instanceof DemoEventObject) {
// 执行事件的回调函数/具体业务逻辑
((DemoEventObject) eventObject).say();
} }
}

客户端

public class Client {
public static void main(String[] args) { // 初始化监听器
DemoEventListener demoEventListenerA = new ConcreteEventListenerA();
DemoEventListener demoEventListenerB = new ConcreteEventListenerB(); // 事件源A
DemoEventSource demoEventSource1 = new DemoEventSource();
demoEventSource1.addListener(demoEventListenerA);
demoEventSource1.addListener(demoEventListenerB);
demoEventSource1.notifyListenerEvents(new DemoEventObject(demoEventSource1)); // 事件源B
DemoEventSource demoEventSource2 = new DemoEventSource();
demoEventSource2.addListener(demoEventListenerB);
demoEventSource2.notifyListenerEvents(new DemoEventObject(demoEventSource2));
}
}

【Design Patterns】监听器模式的更多相关文章

  1. Java基础学习总结(37)——Java23中设计模式(Design Patterns)详解

    设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  2. Design Patterns in Android

    对日常在 Android 中实用设计模式进行一下梳理和总结,文中参考了一些网站和大佬的博客,如 MichaelX(xiong_it) .菜鸟教程.四月葡萄.IAM四十二等,在这里注明下~另外强烈推荐图 ...

  3. Design Patterns Simplified - Part 3 (Simple Factory)【设计模式简述--第三部分(简单工厂)】

    原文链接:http://www.c-sharpcorner.com/UploadFile/19b1bd/design-patterns-simplified-part3-factory/ Design ...

  4. [Design Patterns] 4. Creation Pattern

    设计模式是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结,使用设计模式的目的是提高代码的可重用性,让代码更容易被他人理解,并保证代码可靠性.它是代码编制真正实现工程化. 四个关键元素 ...

  5. [Design Patterns] 3. Software Pattern Overview

    When you're on the way which is unknown and dangerous, just follow your mind and steer the boat. 软件模 ...

  6. 设计模式(Design Patterns)

    设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  7. Design Patterns in Smalltalk MVC 在Smalltalk的MVC设计模式

    Design Patterns in Smalltalk    MVC在Smalltalk的MVC设计模式 The Model/View/Controller (MVC) triad ofclasse ...

  8. 设计模式(Design Patterns)Java版

    设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  9. java Design Patterns

    设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

随机推荐

  1. hdu 2222 Keywords Search——AC自动机

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=2222 第一道AC自动机! T了无数边后终于知道原来它是把若干询问串建一个自动机,把模式串放在上面跑:而且只 ...

  2. WPF error: does not contain a static 'Main' method suitable for an entry point

    WPF error: does not contain a static &apos;Main&apos; method suitable for an entry point doe ...

  3. Arduino 元件

    http://www.rs-online.com/designspark/electronics/

  4. <正则吃饺子> :关于oracle 中 exists 、not exists 的简单使用

    话不多说,简单的总结而已.网络上很多很详细介绍. 例如,博文:http://blog.csdn.net/zhiweianran/article/details/7868894  当然这篇也是转载的,原 ...

  5. TripAdvisor architecture 2011/06

    http://highscalability.com/blog/2011/6/27/tripadvisor-architecture-40m-visitors-200m-dynamic-page-vi ...

  6. file -i haha.csv

    user@user-desk ~/Downloads/largetrd$ file -i LT_Largetrd.csvLT_Largetrd.csv: text/plain; charset=utf ...

  7. 此microsoft fix it不适用于您的操作系统 解决方案

    想卸载低版本的office,下载了一个office卸载程序,但是运行时提示  此microsoft fix it不适用于您的操作系统 错误,在网上找了下解决方案,如下: 右键点击“兼容性疑难检查”,等 ...

  8. USB相关资料

    http://www.usb.org/developers/defined_class/#BaseClass00h http://blog.csdn.net/lizzywu/article/detai ...

  9. 8. php回调后门

    中国菜刀下载,基于原版中国菜刀优化版20160309. 下载地址: http://pan.baidu.com/s/1jHoJxHW China chopper http://pan.baidu.com ...

  10. docker-compose是个好东西,越用越香

     回顾前文 前文演示了在单一容器中部署 Nginx和ASP.NET Core WebApp, 正在前文评论区某大牛指出的,容器化部署 nginx+ASP.NET Core 有更符合实战的部署选择:多容 ...