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

订阅信息、计算器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 数据库到处到Excel

    import MySQLdb import xlwt def outMySQL(file_name): wb = xlwt.Workbook() sh = wb.add_sheet('sheet 1' ...

  2. hihoCoder #1246 王胖浩与环

    题目大意 $n$($1\le n\le 2000$)个正整数 $a_1, a_2, \dots, a_n$($a_i\le 5\times 10^7$)分布在一个圆环上. 定义 $b_k$ 为:将环上 ...

  3. 背包问题--golang的入门解

    . 定义一种 表示静态属性的 关键字 / 修饰符 2. 作用共用.共享 能有此作用的原因分析: Java中,任何变量 / 代码存储时,都是 在编译时 由系统自动分配内存在静态变量编译后,所分配的内存会 ...

  4. windows.open 以post的方式传递参数

    今天看到有篇文章寫到 windows.open 可以post方式傳遞參數,就趕緊照作看看,結果是可行的,感謝撰寫這篇文章的作者~ /** * window.open with post method  ...

  5. 【BZOJ1018】堵塞的交通traffic(线段树,网格图,连通性)

    题意:一个2行C列的矩形网格图,网格上的每个点代表一个城市,相邻的城市之间有一条道路 一开始每条道路都是堵塞的,堵塞即为不可经过.经过一些操作后,可能某些道路通畅了,也可能某些道路堵塞了 多次询问,询 ...

  6. 【CF739B】Alyona and a tree(树上差分,二分,树形DP)

    题意:给出一棵有根树,树上每个点.每条边都有一个权值. 现在给出“控制”的定义:对一个点u,设点v在其子树上,且dis(u,v)≤av,则称u控制v. 要求求出每个点控制了多少个点 n (1 ≤ n  ...

  7. 浅谈JS的arguments对象

    在JavaScript中,arguments属于当前对象的一个内置属性,arguments非常类似于Array对象,但是又不是实例的Array.比如: Array.prototype.testArg ...

  8. POJ 3468:A Simple Problem with Integers(线段树[成段更新])

    题意:N个数Q次操作.一共两种操作:Q l r :询问[l,r]这个区间里的数字和,C l r c: [l,r]区间里的每个数都加上c.1 ≤ N,Q ≤ 100000. 方法:线段树的成段更新.注意 ...

  9. Android图片缓存之Glide进阶(四)

    前言: 前面学习了Glide的简单使用(http://www.cnblogs.com/whoislcj/p/5558168.html),今天来学习一下Glide稍微复杂一点的使用. GlideModu ...

  10. iOS -- 开源项目和库

    TimLiu-iOS 目录 UI 下拉刷新 模糊效果 AutoLayout 富文本 图表 表相关与Tabbar 隐藏与显示 HUD与Toast 对话框 其他UI 动画 侧滑与右滑返回手势 gif动画 ...