java监听器演示样例
监听器的原理是观察者模式。就像明星(事件源)聚拢了一群粉丝(观察者)。当明星有啥举动的时候会通过粉丝们报道出去。
订阅信息、计算器button都是该原理的应用。
以下写了一个监听器的小样例:
package listener;
import java.util.EventObject;
/**
* 定义事件对象,用于标记当前进行的动作。必须继承EventObject。
* @author zyj
*
*/
public class StateEvent extends EventObject {
private static final long serialVersionUID = 5323292975415079206L;
private Enum<ActionEnum> action;
public StateEvent(Object source, Enum<ActionEnum> action) {
super(source);
this.action = action;
}
public Enum<ActionEnum> getAction() {
return action;
}
public void setAction(Enum<ActionEnum> action) {
this.action = action;
}
}
package listener;
public enum ActionEnum {
wake,sleep;
}
package listener;
import java.util.EventListener;
/**
* 定义监听接口,负责监听StateEvent事件。
必须继承EventListener。
* @author zyj
*
*/
public interface StateListener extends EventListener {
void handleState(StateEvent event);
}
package listener;
public class WakeListener implements StateListener {
@Override
public void handleState(StateEvent event) {
if(event.getAction() != null && event.getAction().equals(ActionEnum.wake)){
System.out.println("你醒了。");
}
}
}
package listener;
public class SleepListener implements StateListener {
@Override
public void handleState(StateEvent event) {
if(event.getAction() != null && event.getAction().equals(ActionEnum.sleep)){
System.out.println("你睡了!");
}
}
}
package listener;
import java.util.ArrayList;
import java.util.List;
public class StateManager {
private List<StateListener> list = new ArrayList<StateListener>();
public boolean addListener(StateListener listener){
if(listener == null)
return false;
return list.add(listener);
}
public boolean removeListener(StateListener listener){
if(listener == null)
return false;
return list.remove(listener);
}
private void notifyAllListeners(StateEvent event){
for(StateListener listener : list){
listener.handleState(event);
}
}
public void wake(){
StateEvent event = new StateEvent(this, ActionEnum.wake);
notifyAllListeners(event);
}
public void sleep(){
StateEvent event = new StateEvent(this, ActionEnum.sleep);
notifyAllListeners(event);
}
}
package listener;
public class ListenerTest {
public static void main(String[] args) {
StateManager manager = new StateManager();
manager.addListener(new WakeListener());
manager.addListener(new SleepListener());
manager.wake();
System.out.println("-----------------");
manager.sleep();
}
}
java监听器演示样例的更多相关文章
- Java线程演示样例 - 继承Thread类和实现Runnable接口
进程(Process)和线程(Thread)是程序执行的两个基本单元. Java并发编程很多其它的是和线程相关. 进程 进程是一个独立的执行单元,可将其视为一个程序或应用.然而,一个程序内部同事还包括 ...
- Java多线程演示样例(模拟通话,sleep,join,yield,wait,notify,Semaphore)
主线程等待子线程的多种方法 synchronized浅析 sleep 是静态方法,Thread.sleep(xx)谁调用谁睡眠. join 是合并方法.当前线程调用其它线程xx.join()则等到xx ...
- java设计模式演示样例
创建模式 1.工厂方法模式(Factory Method) 将程序中创建对象的操作,单独出来处理,创建一个产品的工厂接口,把实际的工作转移到详细的子类.大大提高了系统扩展的柔性,接口的抽象化处理给相 ...
- HTTP基本认证(Basic Authentication)的JAVA演示样例
大家在登录站点的时候.大部分时候是通过一个表单提交登录信息.可是有时候浏览器会弹出一个登录验证的对话框.例如以下图,这就是使用HTTP基本认证.以下来看看一看这个认证的工作过程:第一步: clien ...
- Java 8 时间日期库的20个使用演示样例
除了lambda表达式,stream以及几个小的改进之外,Java 8还引入了一套全新的时间日期API,在本篇教程中我们将通过几个简单的任务演示样例来学习怎样使用Java 8的这套API.Java对日 ...
- java 覆盖hashCode()深入探讨 代码演示样例
java 翻盖hashCode()深入探讨 代码演示样例 package org.rui.collection2.hashcode; /** * 覆盖hashcode * 设计HashCode时最重要 ...
- java并行调度框架封装及演示样例
參考资料: 阿里巴巴开源项目 CobarClient 源代码实现. 分享作者:闫建忠 分享时间:2014年5月7日 ---------------------------------------- ...
- Java连接redis的使用演示样例
Java连接redis的使用演示样例 Redis是开源的key-value存储工具,redis通经常使用来存储结构化的数据,由于redis的key能够包括String.hash.listset和sor ...
- java 泛型深入之Set有用工具 各种集合泛型深入使用演示样例,匿名内部类、内部类应用于泛型探讨
java 泛型深入之Set有用工具 各种集合泛型深入使用演示样例,匿名内部类.内部类应用于泛型探讨 //Sets.java package org.rui.generics.set; import j ...
随机推荐
- BZOJ-1085 骑士精神
估价函数其实就是与目标状态有几个不同... 迭代启发搜索. #include <cstdlib> #include <cstdio> #include <cstring& ...
- 洛谷P4175 - [CTSC2008]网络管理
Portal Description 给出一棵\(n(n\leq8\times10^4)\)个点的带点权的树,进行\(m(m\leq8\times10^4)\)次操作,操作有两种: 修改一个点的点权. ...
- js对象的扁平化与反扁平化
Object.flatten = function(obj){ var result = {}; function recurse(src, prop) { var toString = Object ...
- ideaaaaaaaaa
数据库proxy:可以用作自动化数据逆向SQL test4j/jtester:
- hdu 4400 离散化+二分+BFS(暴搜剪枝还超时的时候可以借鉴一下)
Mines Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
- 转 浅谈C++中指针和引用的区别
浅谈C++中指针和引用的区别 浅谈C++中指针和引用的区别 指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法. 1.指针和引用的定义和性 ...
- .net压缩图片质量(附demo)
private void CompressedImage(string fileName, long quality) { FileStream fs = new FileStream(fileNam ...
- Codeforces Gym101606 A.Alien Sunset (2017 United Kingdom and Ireland Programming Contest (UKIEPC 2017))
2017 United Kingdom and Ireland Programming Contest (UKIEPC 2017) 寒假第一次组队训练赛,和学长一起训练,题目难度是3颗星,我和猪队友写 ...
- git移除上一次的commit中误添加的文件
在使用git进行版本管理时,往往会出现一些误操作,比如将一些不加上传的文件放到了暂存区,即上传到了上一次commit中 比如: commit c134ab90ca7c4daf8bfa22e3ad706 ...
- UvaLive 4287 Proving Equivalences 强连通缩点
原题链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...