监听器的原理是观察者模式。就像明星(事件源)聚拢了一群粉丝(观察者)。当明星有啥举动的时候会通过粉丝们报道出去。

订阅信息、计算器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监听器演示样例的更多相关文章

  1. Java线程演示样例 - 继承Thread类和实现Runnable接口

    进程(Process)和线程(Thread)是程序执行的两个基本单元. Java并发编程很多其它的是和线程相关. 进程 进程是一个独立的执行单元,可将其视为一个程序或应用.然而,一个程序内部同事还包括 ...

  2. Java多线程演示样例(模拟通话,sleep,join,yield,wait,notify,Semaphore)

    主线程等待子线程的多种方法 synchronized浅析 sleep 是静态方法,Thread.sleep(xx)谁调用谁睡眠. join 是合并方法.当前线程调用其它线程xx.join()则等到xx ...

  3. java设计模式演示样例

    创建模式 1.工厂方法模式(Factory Method)  将程序中创建对象的操作,单独出来处理,创建一个产品的工厂接口,把实际的工作转移到详细的子类.大大提高了系统扩展的柔性,接口的抽象化处理给相 ...

  4. HTTP基本认证(Basic Authentication)的JAVA演示样例

    大家在登录站点的时候.大部分时候是通过一个表单提交登录信息.可是有时候浏览器会弹出一个登录验证的对话框.例如以下图,这就是使用HTTP基本认证.以下来看看一看这个认证的工作过程:第一步:  clien ...

  5. Java 8 时间日期库的20个使用演示样例

    除了lambda表达式,stream以及几个小的改进之外,Java 8还引入了一套全新的时间日期API,在本篇教程中我们将通过几个简单的任务演示样例来学习怎样使用Java 8的这套API.Java对日 ...

  6. java 覆盖hashCode()深入探讨 代码演示样例

    java 翻盖hashCode()深入探讨 代码演示样例 package org.rui.collection2.hashcode; /** * 覆盖hashcode * 设计HashCode时最重要 ...

  7. java并行调度框架封装及演示样例

    參考资料:  阿里巴巴开源项目 CobarClient  源代码实现. 分享作者:闫建忠 分享时间:2014年5月7日 ---------------------------------------- ...

  8. Java连接redis的使用演示样例

    Java连接redis的使用演示样例 Redis是开源的key-value存储工具,redis通经常使用来存储结构化的数据,由于redis的key能够包括String.hash.listset和sor ...

  9. java 泛型深入之Set有用工具 各种集合泛型深入使用演示样例,匿名内部类、内部类应用于泛型探讨

    java 泛型深入之Set有用工具 各种集合泛型深入使用演示样例,匿名内部类.内部类应用于泛型探讨 //Sets.java package org.rui.generics.set; import j ...

随机推荐

  1. BZOJ-1085 骑士精神

    估价函数其实就是与目标状态有几个不同... 迭代启发搜索. #include <cstdlib> #include <cstdio> #include <cstring& ...

  2. 洛谷P4175 - [CTSC2008]网络管理

    Portal Description 给出一棵\(n(n\leq8\times10^4)\)个点的带点权的树,进行\(m(m\leq8\times10^4)\)次操作,操作有两种: 修改一个点的点权. ...

  3. js对象的扁平化与反扁平化

    Object.flatten = function(obj){ var result = {}; function recurse(src, prop) { var toString = Object ...

  4. ideaaaaaaaaa

    数据库proxy:可以用作自动化数据逆向SQL test4j/jtester:

  5. hdu 4400 离散化+二分+BFS(暴搜剪枝还超时的时候可以借鉴一下)

    Mines Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Subm ...

  6. 转 浅谈C++中指针和引用的区别

    浅谈C++中指针和引用的区别 浅谈C++中指针和引用的区别   指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法. 1.指针和引用的定义和性 ...

  7. .net压缩图片质量(附demo)

    private void CompressedImage(string fileName, long quality) { FileStream fs = new FileStream(fileNam ...

  8. Codeforces Gym101606 A.Alien Sunset (2017 United Kingdom and Ireland Programming Contest (UKIEPC 2017))

    2017 United Kingdom and Ireland Programming Contest (UKIEPC 2017) 寒假第一次组队训练赛,和学长一起训练,题目难度是3颗星,我和猪队友写 ...

  9. git移除上一次的commit中误添加的文件

    在使用git进行版本管理时,往往会出现一些误操作,比如将一些不加上传的文件放到了暂存区,即上传到了上一次commit中 比如: commit c134ab90ca7c4daf8bfa22e3ad706 ...

  10. UvaLive 4287 Proving Equivalences 强连通缩点

    原题链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...