Java Listener pattern 监听者模式
Java Listener pattern 监听者模式
2016-5-12
监听者模式(观察者模式)能降低对象之间耦合程度。为两个相互依赖调用的类进行解耦。
便于进行模块化开发工作。不同模块的开发者可以专注于自身的代码。
监听者用来监听自已感兴趣的事件,当收到自已感兴趣的事件时执行自定义的操作。
在某些数据变化时,其他的类做出一些响应。处理数据(或者分发事件)的类主动投送消息,感兴趣
的类主动“订阅”消息。
监听者模式在Android中有大量的运用,相信大家都不会感到陌生。在Android开发中,Button控件的
点击事件就是监听者模式最常见的例子。
当Button被点击,执行了 OnClickListener.onClick;Activity中给这个Button设置了自己实现
的OnClickListener,并复写了onClick方法,就能执行自定义操作了。
Java代码实例
下面来用Java来实现监听者模式。
这个例子是给“计算类”持续地传入数据,处理好数据后,发出结果。感兴趣的类接收结果。
2个文件:AlgoCalculator.java;MainUser.java
AlgoCalculator.java是计算部分,接收数据并进行计算。并将结果传递出去。MainUser.java是调用方,将基本数据传入AlgoCalculator并监听结果。
package com.algo;
import java.util.LinkedList;
import java.util.List;
public class AlgoCalculator {
private List<short[]> mDataBuffer = new LinkedList<>();
public AlgoCalculator() {
}
// 定义一个Listener接口;可将一个boolean值传递出去
public interface ResultChangeListener {
void onChange(boolean found);
}
private ResultChangeListener resultChangeListener;
// 调用方能够设置并实现这个接口
public void setResultChangedListener(ResultChangeListener resultChangedListener) {
this.resultChangeListener = resultChangedListener;
}
// 传输数据
public void setDataStream(short[] data) {
checkData(data);// 处理数据方法
}
// 处理数据,并送出结果
private void checkData(short[] data) {
if (data.length == 0) {
return;
}
long sum = 0;
for (short b : data) {
sum += b;
}
if (sum > 40) {
resultChangeListener.onChange(true); // 数据处理结果
} else {
resultChangeListener.onChange(false);
}
}
}
主程序;调用方传入数据,获取结果
import com.algo.AlgoCalculator;
public class MainUser {
public static void main(String[] args) {
AlgoCalculator algoCalculator = new AlgoCalculator(); // 初始化
// 设置监听器,并在里面增加要执行的动作
algoCalculator.setResultChangedListener(new AlgoCalculator.ResultChangeListener() {
@Override
public void onChange(boolean found) {
System.out.println("result: " + found);
}
});
short[] data1 = {1, 2, 3,};
short[] data2 = {10, 20, 30};
short[] data3 = {6, 7, 8};
short[] data4 = {1, 1, 1};
// 传入数据
algoCalculator.setDataStream(data1); // output false
algoCalculator.setDataStream(data2); // output true
algoCalculator.setDataStream(data3); // output false
algoCalculator.setDataStream(data4); // output false
}
}
在另外的类里,能够很方便地调用AlgoCalculator的计算能力并获取计算结果。
在这里,每传入一次数据,就能获取一个结果。如果每秒钟传入一次数据,每秒钟就能获取一个结果。
我们可以把复杂的算法封装起来,客户端只需要传入数据,即可获得(监听到)结果。
很多场景中都使用了监听者模式。程序员也可能在不知不觉中就运用了这个模式。
Java Listener pattern 监听者模式的更多相关文章
- 在C++11中实现监听者模式
参考文章:https://coderwall.com/p/u4w9ra/implementing-signals-in-c-11 最近在完成C++大作业时,碰到了监听者模式的需求. 尽管C++下也可以 ...
- 在java.util中有EventListener接口:所有事件监听者都要实现这个接口。
在java.util中有EventListener接口:所有事件监听者都要实现这个接口. java.util中有EventObject类:所有的事件都为其子类. 事件范例在\CoreJava\Gi ...
- Java监听模式
说明 生活中,监听无处不在.比如说,手机播放音乐功能,也是一种监听:你不点击播放按钮,手机就不放歌,当你点击时,手机就播放音乐.即触发某种行为,便执行相应的动作. 组成 Java监听模式右三个部分组成 ...
- Web应用中监听者的通知顺序按照DD中的定义顺序
Web应用中监听者的通知顺序按照DD中的定义顺序: XML: <?xml version="1.0" encoding="UTF-8"?> < ...
- Java设计模式补充:回调模式、事件监听器模式、观察者模式(转)
一.回调函数 为什么首先会讲回调函数呢?因为这个是理解监听器.观察者模式的关键. 什么是回调函数 所谓的回调,用于回调的函数. 回调函数只是一个功能片段,由用户按照回调函数调用约定来实现的一个函数. ...
- Java 设计模式泛谈&装饰者模式和单例模式
设计模式(Design Pattern) 1.是一套被反复使用.多人知晓的,经过分类编目 的 代码设计经验总结.使用设计模式是为了可重用代码,让代码更容易维护以及扩展. 2.简单的讲:所谓模式就是得到 ...
- JAVA 正则 Pattern 和 Matcher
java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. 1.简介: java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. ...
- java正则表达式Pattern和Matcher
java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. 1.简介: java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. ...
- Spark Streaming揭秘 Day34 解析UI监听模式
Spark Streaming揭秘 Day34 解析UI监听模式 今天分享下SparkStreaming中的UI部分,和所有的UI系统一样,SparkStreaming中的UI系统使用的是监听器模式. ...
随机推荐
- CentOS 虚拟机安装详解
第一步:安装 VMware 官方网站:www.vmware.com 下载百度云链接:http://pan.baidu.com/s/1bphDOWv 密码:0zix VMware 是一个虚拟 PC 的软 ...
- Blend在WPF开发过程中的作用
WPF开发时,用VS2012就足够了,因为里面的确有控件拖放编辑和便利的带输入自动完成的xaml编辑器. 但是在需要改变某些控件的样式时,特别是style和template是,看网上搜到的教程,洋洋洒 ...
- Dojo初探之2:设置dojoConfig详解,dojoConfig参数详解+Dojo中预置自定义AMD模块的四种方式(基于dojo1.11.2)
Dojo中想要加载自定义的AMD模块,需要先设置好这个模块对应的路径,模块的路径就是这个模块的唯一标识符. 一.dojoConfig参数设置详解 var dojoConfig = { baseUrl: ...
- 使用MySQLdb操作Mysql数据库
MySQLdb简介 MySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQLAB公司.在2008年1月16号被Sun公司收购.目前MySQL被广泛地应用在Internet上的中小型网站中.由于 ...
- spring quartz开发中使用demo
1.首先在pom.xml中配置quartz的jar: <!--定时器--> <dependency> <groupId>org.quartz-scheduler&l ...
- [转] .NET领域驱动设计—初尝(疑问、模式、原则、工具、过程、框架、实践)
阅读目录: 1.1.疑问 1.1.1.UML何用 1.1.2.领域建模 1.2.模式 1.3.原则 1.5.过程 1.6.框架 1.7.项目演示 最近在研究DDD颇有收获,所以整理出来跟大家分享,共同 ...
- 关于java反射获取泛型
public class Test<T> { private final TypeToken<T> typeToken = new TypeToken<T>(get ...
- Ubuntu16.04 + caffe-ssd + [CPU_ONLY] + KITTI 训练总结
本次训练主要参考:http://blog.csdn.net/jesse_mx/article/details/65634482 感谢 Jesse_Mx ,帮助了我很多. 坑一[openCV未安装成功] ...
- HTML基本文件, CSS基础
HTML 一.HTML基本文件 [meta标签] 1.charset属性:单独使用.设置文档字符集编码格式. >>>写法:<meta charset ...
- java中得到图片的宽度 高度:
java中得到图片的宽度 高度:BufferedImage srcImage = null;srcImage = ImageIO.read(new File(srcImagePath));int sr ...