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

订阅信息、计算器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. Python web 周总结

    按顺序查询 order_by()    order_by(- ) 下拉框默认显示 <select name="canteen_type_id" id="" ...

  2. Python之实时调度任务

    过了年就开始面临毕业了,毕业季是幸福的,但也是紧迫的.2月已过就开始着手策划毕业论文了,一直到现在,论文基本完成了,感觉过去的一个半月的时间,对自己过去2年在实验室所学又温习了一遍.书到用时方恨少,在 ...

  3. kb-07专题线段树-02--单点修改,区间最值

    /* 区间单点该值,区间查询最大值: hdu-1754 */ #include<iostream> #include<cstdio> #include<cstring&g ...

  4. bzoj1566【Noi2009】管道取珠

    题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1566 两个栈不断pop,共C(n+m,n)种,ai表示每个相同序列的方案数,求∑(ai^2) ...

  5. iOS-Core Data基础

    Core Data基础 Core Data是一个API集合,被设计用来简化数据对象的持久存储. 在此先不普及概念,先通过一个简单的案例使用来感受一下Core Data的精妙之处. 在创建工程的时候勾选 ...

  6. scrapy爬取用户信息 ---崔志才

    这个实例还是值得多次看的 其流程图如下,还是有一点绕的. 总结: 1 Requst(rul=' xxx ',callback= ' '),仅仅发起 某个网页 的访问请求,没啥了.剩下的交给回调函数 2 ...

  7. BQ25890 charging ic evb 使用注意事項

    Origin : 今天做了一個小實驗, 從 bq25890 spec 可以知道, enable bq25896 充電的功能,有二個條件, 1.CHG_CONFIG bit 需為1. 2.ce pin ...

  8. 如何解决div里面img图片下方有空白的问题?

    空白产生原因: 图片默认的vertical-align是baseline,(元素放置在父元素的基线上,也就是xx下边距) 一个inline-block元素,如果里面没有inline元素,或者overf ...

  9. Software Engineering | Strategy pattern

    聚合关系.

  10. 证书锁定Certificate Pinning技术

    证书锁定Certificate Pinning技术   在中间人攻击中,攻击主机通常截断客户端和服务器的加密通信.攻击机以自己的证书替代服务器发给客户端的证书.通常,客户端不会验证该证书,直接接受该证 ...