16)JAVA实现回调(Android,Swing中各类listener的实现)

?

?????熟悉MS-Windows和X Windows事件驱动设计模式的开发人员,通常是把一个方法的指针传递给事件源,当某一事件发生时来调用这个方法(也称为“回调”)。Java的面向对象的模型目前不支持方法指针,似乎不能使用这种方便的机制。
?????Java支持interface,通过interface可以实现相同的回调。其诀窍就在于定义一个简单的interface,申明一个被希望回调的方法。
?????例如,假定当某一事件发生时会得到通知,我们可以定义一个interface:
??????????public interface InterestingEvent {
????????????? // 这只是一个普通的方法,可以接收参数、也可以返回值
????????????? public void interestingEvent();
??????????}
这样我们就有了任何一个实现了这个接口类对象的手柄grip。

当一事件发生时,需要通知实现InterestingEvent 接口的对象,并调用interestingEvent() 方法。
class EventNotifier {
??? private InterestingEvent ie;
??? private boolean somethingHappened;
??? public?EventNotifier(InterestingEvent event) {
??????? ie = event;
??????? somethingHappened = false;
??? }
??? public void?doWork() {
??????? if (somethingHappened) {
??????????? // 事件发生时,通过调用接口的这个方法来通知
??????????? ie.interestingEvent();
??????? }???????
??? }
}
在这个例子中,用somethingHappened 来标志事件是否发生。

希望接收事件通知的类必须要实现InterestingEvent 接口,而且要把自己的引用传递给事件的通知者。
public class CallMe implements InterestingEvent {
??? private EventNotifier en;
??? public CallMe() {
??????? // 新建一个事件通知者对象,并把自己传递给它
??????? en = new EventNotifier(this);
??? }
??? // 实现事件发生时,实际处理事件的方法
??? public void interestingEvent() {
??????? // 这个事件发生了,进行处理
??? }
}
以上是通过一个非常简单的例子来说明Java中的回调的实现。

当然,也可以在事件管理或事件通知者类中,通过注册的方式来注册多个对此事件感兴趣的对象。

1. 定义一个接口InterestingEvent ,回调方法nterestingEvent(String event) 简单接收一个String 参数。 ? ? ? ? ??

?????interface InterestingEvent {

???????? public void interestingEvent(String event);
?????}

2. 实现InterestingEvent接口,事件处理类

?????class CallMe implements InterestingEvent {
??? ?????private String name;
???????? public CallMe(String name){
? ? ? ? ?this.name = name;
??? ?????}???
??? ?????public void interestingEvent(String event) {
??????? ?????System.out.println(name + ":[" +event? + "] happened");
???????? }
?????}

3. 事件管理者,或事件通知者
?????class EventNotifier {
??? ?????private List<CallMe> callMes = new ArrayList<CallMe>();
??? ?????public void regist(CallMe callMe){
??????? ?????callMes.add(callMe);
??? ?????}
???
???????? public void doWork(){
???????????? for(CallMe callMe: callMes) {
???????????????? callMe.interestingEvent("sample event");
??????? ?????}
??? ?????}???
?????}

4. 测试
?????public class CallMeTest {
???????? public static void main(String[] args) {
???????????? EventNotifier ren = new EventNotifier();
??????? ?????CallMe a = new CallMe("CallMe A");
???????????? CallMe b = new CallMe("CallMe B");

???????????? // regiest
???????????? ren.regist(a);
???????????? ren.regist(b);
???????
???????????? // test
???????????? ren.doWork();???????
??? ?????}
?????}

时间: 2024-11-14 12:50:21

16)JAVA实现回调(Android,Swing中各类listener的实现)的相关文章

Android学习探索之Java 8 在Android 开发中的应用

前言: Java 8推出已经将近2年多了,引入很多革命性变化,加入了函数式编程的特征,使基于行为的编程成为可能,同时减化了各种设计模式的实现方式,是Java有史以来最重要的更新.但是Android上,一直没有看到支持Java8的消息.Android到底会不会支持Java8呢?答案是肯定的,Android N已经开始支持Java 8 了. 关于Java 8 (1.)使用Lambda表达式 Java 8的一大亮点是引入Lambda表达式,使用它设计的代码会更加简洁.当开发者在编写Lambda表达式时

初探Java设计模式4:JDK中的设计模式

JDK中设计模式 本文主要是归纳了JDK中所包含的设计模式,包括作用和其设计类图.首先来个总结,具体的某个模式可以一个一个慢慢写,希望能对研究JDK和设计模式有所帮助.一.设计模式是什么(1)反复出现问题的解决方案(2)增强软件的灵活性(3)适应软件不断变化二.学习JDK中设计模式的好处(1)借鉴优秀代码的设计,有助于提高代码设计能力(2)JDK的设计中体现了大多数设计模式,是学习设计模式的较好的方式(3)可以更加深入的了解JDK三.类间关系继承.委托.依赖.聚合.组合?四.介绍方式(1)作用:

浅析android系统设计中的回调思想

为何写作本文 ??在慢慢深入接触android开发的过程中,我越来越发现android中(至少应用曾的开发)用到了很多回调的思想.比如activity的生命周期,fragment的生命周期,皆是回调函数实现的,android中的事件处理机制其一就是回调,线程方面的异步任务.loader.hanlder等都是基于回调的,等等. ??可见android的其一根本思想就是回调,需要你来参与时,回调用相关的回调方法,你来填充. ??可以说回调的思想浸润与android设计的方方面面,android开发中

java中的反射机制在Android开发中的用处

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制.      然而在android中Google很多的类的某些方法不让第三方应用去调用,通过java反射机制能把这些隐藏方法获取出来并调用,三方应用上我们就很方便的去用这些方法.      例如我们需要安全的杀死某个应用的服务和进程调用ActivityManager.forceStopPack

Eclipse中使用recyclerview时出现Caused by: java.lang.NoClassDefFoundError: android.support.v7.recyclerview.R$styleable

转自: http://blog.csdn.net/chenleicpp/article/details/46848785 程序崩溃,错误提示: Caused by: java.lang.NoClassDefFoundError: android.support.v7.recyclerview.R$styleable 原因: 在eclipse中使用RecyclerView,编译没有问题,但是运行时候会出现如下错误,百思不得其解,又说v4包与v7包版本不一致,有说没有导入v7-compat包的,经反

Java Swing中的SwingWorker

Swing中的SwingWorker主要是用来执行比较耗时的任务. Java doc文档中中包含了一些简单的例子. An abstract class to perform lengthy GUI-interaction tasks in a background thread. Several background threads can be used to execute such tasks. However, the exact strategy of choosing a threa

第二节 Java Swing中的基本容器:JFrame

第二节 基本容器:JFrame 如果要使用Swing创建一个窗口,则直接使用JFrame即可,此类事Component类的子类,常用方法如下: 小试牛刀 创建一个简单的窗口 import java.awt.*; import java.io.*; import javax.swing.*; public class JavaSwingTest { public static void main(String args[]) throws IOException{ test1(); } //创建一

Android Java 与 C++ 调用过程中的常量,路径名、文件名、后缀名最大长度

/**************************************************************************** **************************************************************************** *** ***   This header was automatically generated from a Linux kernel header ***   of the same

android开发中,在java中如何使用c提供过来char*

这个char*如果是一般的字符串的话,作为string传回去就可以了.如果是含有'\0'的buffer,最好作为bytearray传出,因为可以制定copy的length,如果copy到string,可能到'\0'就截断了. 有两种方式传递得到的数据: 一种是在jni中直接new一个byte数组,然后调用函数(*env)->SetByteArrayRegion(env, bytearray, 0, len, buffer);将buffer的值copy到bytearray中,函数直接return