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

订阅信息、计算器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. 二进制<4>

    位运算简介及实用技巧(四):实战篇 下面分享的是我自己写的三个代码,里面有些题目也是我自己出的.这些代码都是在我的Pascal时代写的,恕不提供C语言了.代码写得并不好,我只是想告诉大家位运算在实战中 ...

  2. ida动态调试笔记

    ida动态调试笔记 目标文件:阿里安全挑战赛的第二题 点击打开链接 使用环境:ida6.8点击打开链接,adt bundle点击打开链接 首先打开avd安卓模拟器,界面如下: 在dos下运行adb命令 ...

  3. [POJ3974]Palindrome(后缀数组 || manacher)

    传送门 求一个串的最长回文子串的长度 1.后缀数组 把这个串反转后接到原串的后面,中间连一个没有出现过的字符. 然后求这个新字符串的某两个后缀的公共前缀的最大值即可. ——代码 #include &l ...

  4. BZOJ4514 [Sdoi2016]数字配对 【费用流】

    题目 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数, 那么这两个数字可以配对,并获得 ci×c ...

  5. hdu 6119 小小粉丝度度熊

    小小粉丝度度熊 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  6. c#.net分类上升达人~~~呵呵。。。

    原文发布时间为:2008-11-11 -- 来源于本人的百度文章 [由搬家工具导入] 觉得自己蛮无聊的~~~~~~~~~(>_<)~~~~

  7. 从网上搜集的X86 显示 int 10H

    INT 10H 是由 BIOS 对屏幕及显示器所提供的服务程序,而后倚天公司针对倚天中文提供了许多服务程序,这些服务程序也加挂在 INT 10H 内.使用 INT 10H 中断服务程序时,先指定 AH ...

  8. svn不是内部或外部命令?

    svn不是内部或外部命令? 我的系统是Win7, [计算机]-->右键[属性]-->[高级系统设置]-->[环境变量]-->[系统变量 (S)]-->[Path]--&g ...

  9. Day 18 函数之一

    函数参数: 1.形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元.因此,形参只在函数内部有效.函数调用结束返回主调用函数后则不能再使用该形参变量 2.实参可以是常量.变量. ...

  10. PythonWeb开发教程(二),搭建第一个django项目

    这篇写怎么创建django项目,以及把django项目运行起来. 1.创建django项目 a.使用命令创建,安装完django之后就有django-admin命令了,执行命令创建即可,命令如下:   ...