【Design Patterns】监听器模式
监听器模式
监听器模式其实是观察者模式中的一种,两者都有关于回调的设计。
与观察者模式不同的是,观察者模式中存在的角色为观察者(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】监听器模式的更多相关文章
- Java基础学习总结(37)——Java23中设计模式(Design Patterns)详解
设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- Design Patterns in Android
对日常在 Android 中实用设计模式进行一下梳理和总结,文中参考了一些网站和大佬的博客,如 MichaelX(xiong_it) .菜鸟教程.四月葡萄.IAM四十二等,在这里注明下~另外强烈推荐图 ...
- Design Patterns Simplified - Part 3 (Simple Factory)【设计模式简述--第三部分(简单工厂)】
原文链接:http://www.c-sharpcorner.com/UploadFile/19b1bd/design-patterns-simplified-part3-factory/ Design ...
- [Design Patterns] 4. Creation Pattern
设计模式是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结,使用设计模式的目的是提高代码的可重用性,让代码更容易被他人理解,并保证代码可靠性.它是代码编制真正实现工程化. 四个关键元素 ...
- [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. 软件模 ...
- 设计模式(Design Patterns)
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- Design Patterns in Smalltalk MVC 在Smalltalk的MVC设计模式
Design Patterns in Smalltalk MVC在Smalltalk的MVC设计模式 The Model/View/Controller (MVC) triad ofclasse ...
- 设计模式(Design Patterns)Java版
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- java Design Patterns
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
随机推荐
- 百度地图API的第一次接触——自定义控件
1.定义一个控件类,即function function ZoomControl(){ // 设置默认停靠位置和偏移量 this.defaultAnchor = BMAP_ANCHOR_TOP_LEF ...
- MVC之一、预备知识储备
自动属性 隐式类型 对象初始化器与集合初始化器 匿名类 扩展方法 Lambda表达式 (1).自动属性(Auto-Implemented Properties) C#自动属性可以避免原来这样我们手工声 ...
- MVC 模式介绍(1)
MVC 模式 MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式.这种模式用于应用程序的分层开发. Model(模型) - 模型代表一个存取数据的对象或 JAVA ...
- 基于keepalived的nginx高可用
#nginx,keepalived安装略过 MASTER 节点配置文件(192.168.1.11) vi /etc/keepalived/keepalived.conf global_defs { # ...
- 20.Consent Controller Get请求逻辑实现
在这里之前讲的这一块的信息就要登场了 需要通过构造函数把这几个注入进来 县引入这三个命名空间 把这三个注入进来,这就是显示依赖 先通过returnUrl拿到这个Request request拿到后,就 ...
- 使用gRPC搭建Server端与Client端
gRPC简介 gRPC是一种RPC框架技术,采用Protocal Buffers(协议缓存) 作为其接口定义的语言(就是Proto来写接口)和基础的消息交换格式. 在gRPC中,客户端应用程序可以直接 ...
- u17 u18共存
公司用的Unity版本是2017版本的,由于需要尝试一些实验性的新功能,我就安装了Unity2018版本,结果发现Unity2018版本破解之后,Unity2017版本不能用了.那么怎么解决两个版本的 ...
- unity3d四元数和旋转矩阵
http://blog.csdn.net/kfqcome/article/details/10729551 一 四元数 Quaternion中存放了x,y,z,w四个数据成员,可以用下标来进行访问,对 ...
- poj3667(线段树区间合并&区间查询)
题目链接: http://poj.org/problem?id=3667 题意:第一行输入 n, m表示有 n 间房间(连成一排的), 接下来有 m 行输入, 对于接下来的 m 行输入: 1 x : ...
- JDBC连接数据以及详细的ResultSet结果集解释
一.数据库连接 (前面为jdbc的其他参数,文章下部分为ResultSet详解) ResultSet rs = st.executeQuery(sqlStr) 1. java的sql框架支持多种数据库 ...