Java监听器原理及实例

一、监听器原理
- 监听器是基于事件驱动的,用于对操作事件进行监听、处理,是观察者设计模式的应用
- 监听器三元素:
2.1 事件源:事件发生的源头
2.2 事件:对事件进行抽象、封装
2.3 监听器:用于监听事件源,当事件发生时进行处理
二、监听器实例:此案例主要围绕购物车场景操作事件的实现,有一定的实际项目参考性
- UML类图模型

- 接口及实现类、场景类定义
package com.wuji; import java.util.EventListener; /**
* event listener handler interface must extends EventListener
*/
public interface EventListenerHandler extends EventListener {
void handler(EventInfo eventInfo);
}package com.wuji; /**
* Event Info operator interface
*/
public interface EventInfo {
String getEventType(); Object getEventSource();
}package com.wuji; /**
* 添加事件监听器,实现监听器接口类
*/
public class AddEventListenerHandler implements EventListenerHandler { public void handler(EventInfo eventInfo) {
if(eventInfo==null){
return;
}
if(eventInfo.getEventType().equals("add")){
System.out.println("添加购物车事件。。。");
} EventSource eventSource=(EventSource)eventInfo.getEventSource();
int productCount=eventSource.getCount();
System.out.println("购物车中现在有商品:" + productCount + "件");
}
}package com.wuji; import java.util.EventObject; public class AddEvent extends EventObject implements EventInfo { private final String eventType="add";
public AddEvent(Object source){
super(source);
}
@Override
public String getEventType() {
return eventType;
} @Override
public Object getEventSource() {
return getSource();
}
}package com.wuji; import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List; /**
* 事件源:具体为购物辐操作事件源
*/
public class EventSource {
private Collection<EventListenerHandler> eventListenerHandlers=null;
private int count=0; public int getCount(){
return count;
} public void registryEventListenerHandler(EventListenerHandler eventListenerHandler){
if(eventListenerHandlers==null){
eventListenerHandlers=new HashSet<EventListenerHandler>();
eventListenerHandlers.add(eventListenerHandler);
}
} public void removeEventListenerHandler(EventListenerHandler eventListenerHandler){
if(eventListenerHandlers!=null){
eventListenerHandlers.remove(eventListenerHandler);
}
} public void addCar(){
++count;
if(eventListenerHandlers!=null){
EventInfo eventInfo=new AddEvent(this);
notifies(eventInfo);
}
System.out.println("向购物车添加商品成功...");
} private void notifies(EventInfo eventInfo){
Iterator iterator=eventListenerHandlers.iterator();
while (iterator.hasNext()){
((EventListenerHandler)iterator.next()).handler(eventInfo);
}
} }package com.wuji; public class Client {
public static void main(String[] args) {
EventSource eventSource=new EventSource();
EventListenerHandler addEventListenerHandler=new AddEventListenerHandler();
eventSource.registryEventListenerHandler(addEventListenerHandler);
//eventSource.removeEventListenerHandler(addEventListenerHandler);
eventSource.addCar();
eventSource.addCar();
}
}
三、总结:上面的案例是围绕购物车操作场景进行事件监听操作的,主要涉及三个元素即事件源【EventSource】、事件信息接口【EventInfo】、事件监听处理器接口【EventListenerHandler】,其中事件信息和事件监听处理器是接口,具体实现为:添加事件信息、添加事件监听处理器,具体见上面相关代码。事件监听处理器传递了事件源,可以通过事件源进行操作相关行为。如本例的获取购物车商品数量。大家可以试着实现购物车的删除事件并运行查看结果。事件源封装了事件注册中心,可以注册和取消多个具体事件监听器。
Java监听器原理及实例的更多相关文章
- JAVA监听器原理
http://blog.csdn.net/longyulu/article/details/25054697 JAVA监听器原理 标签: 监听器 2014-05-05 15:40 9070人阅读 评论 ...
- Java NIO原理及实例
Java NIO是在jdk1.4开始使用的,它既可以说成“新I/O”,也可以说成非阻塞式I/O.下面是java NIO的工作原理: 1. 由一个专门的线程来处理所有的 IO 事件,并负责分发. 2. ...
- java监听器原理理解与实现
监听器模型涉及以下三个对象,模型图如下: (1)事件:用户对组件的一个操作,称之为一个事件(2)事件源:发生事件的组件就是事件源(3)事件监听器(处理器):监听并负责处理事件的方法 执行顺序如下: 1 ...
- 分布式一致性协议Raft原理与实例
分布式一致性协议Raft原理与实例 1.Raft协议 1.1 Raft简介 Raft是由Stanford提出的一种更易理解的一致性算法,意在取代目前广为使用的Paxos算法.目前,在各种主流语言中都有 ...
- Java NIO原理分析
Java IO 在Client/Server模型中,Server往往需要同时处理大量来自Client的访问请求,因此Server端需采用支持高并发访问的架构.一种简单而又直接的解决方案是“one-th ...
- Java编译原理
http://wenku.baidu.com/view/f9b1734b87c24028915fc3a3.html Java编译原理 1. 关于动态加载机制 学习Java比C++更容易理解OOP的思想 ...
- 《Java虚拟机原理图解》1.4 class文件里的字段表集合--field字段在class文件里是如何组织的
0.前言 了解JVM虚拟机原理是每个Java程序猿修炼的必经之路.可是因为JVM虚拟机中有非常多的东西讲述的比較宽泛.在当前接触到的关于JVM虚拟机原理的教程或者博客中,绝大部分都是充斥的文字性的描写 ...
- Java工作原理:JVM,内存回收及其他
JAVA虚拟机系列文章 http://developer.51cto.com/art/201001/176550.htm Java语言引入了Java虚拟机,具有跨平台运行的功能,能够很好地适应各种We ...
- JAVA监听器Listener
JAVA监听器Listener 一. 简介 监听器用于对web中内置对象的状态或者属性变化进行监听并做出相应响应的一种Servlet;在内置对象的生命周期中,产生.销毁等状态发生变化时,监听器就会进行 ...
随机推荐
- integer storage and decimal storage differences in java
package storage.java; public class StorageJava { public static void main(String[] args) { byte b = 1 ...
- 微信小程序-04-详解介绍.json 配置文件
致我自己:小程序开发不是简单一两天的事,一两天只能算是了解,有时候看多了会烦,感觉很熟悉了,其实只是对表面进行了解,对编程却知之甚少,小程序开发不是简单的改模板,一两天很多部分改模板可能都做不到,坚持 ...
- Java中执行.exe文件
public static void main(String args[]){ try { String command ="notepad"; // 笔记本 Process ch ...
- Current_Path 获取脚本所在路径(当前路径),取当前时间做文件名(uformat)
获取脚本当前所在路径: $CurrentPath = $MyInvocation.MyCommand.Path.substring(0,$MyInvocation.MyCommand.Path.Las ...
- Java学习---JAVA的类设计
基础知识 JAVA是由C/C++语言发展而来的纯面向对象语言,其基本元素包括:简单数据类型 和 复合数据类型(即类).类是对客观事物的抽象描述,它有面向对象的四个特点,即:封装性.继承性.多态性和通信 ...
- 深入浅出SharePoint——使用WinDbg进行调试
- error MSB8031: Building an MFC project for a non-Unicode character set is deprecated. You must change the project property to Unicode or download an additional library. See http://go.microsoft.co
Win10,也重新装了免费版的Visual Studio 2013 y,写MFC程序时候发现这样的提示: error MSB8031: Building an MFC project for a no ...
- facebook页面种简单测试js调用flash开放的js接口的方法
无意间折腾出来的,此方法很triky,但是很简单有效. 背景说明: facebook种内嵌的iframe无法直接访问. 解决方法: chrome浏览器为例 1.右键查看iframe源代码,此时进入if ...
- python30 excel修改模块xlutils
xlrd只读,xlwt只写,xlutils模块则将读写功能结合起来.https://pypi.org/project/xlutils/ 修改excel通过xlutils的copy函数将<clas ...
- python文件读写模式 --- r,w,a,r+,w+,a+,rb,wb
要了解文件读写模式,需要了解几种模式的区别,以及对应指针 r : 读取文件,若文件不存在则会报错 w: 写入文件,若文件不存在则会先创建再写入,会覆盖原文件 a : 写入文件,若文件不存在则会先创建再 ...