java callback 接口_JAVA通过接口来实现CALLBACK

在网上看了好多关于java回调的文章,自己总结了一下(个人意见,仅供参考):

JAVA通过接口来实现CALLBACK。

例:

1.class   A,class   B

2.class   A实现接口operate

3.class   B拥有一个参数为operate接口类型的函数test(operate   o)

4.class   A运行时调用class   B中test函数,以自身传入参数

5.class   B已取得A,就可以随时回调A所实现的operate接口中的方法

=========================================================================

接口和回调.编程一个常用的模式是回调模式,在这种模式中你可以指定当一个特定时间发生时回调对象上的方法。

==========================================================================

概括一句:回调函数实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为回调函数)的地址作为参数传递给那个函数。而那个函数在需要的时候,利用传递的地址调用回调函数,这时你可以利用这个机会在回调函数中处理消息或完成一定的操作。

===========================================================================

借用John D. Mitchell的例子应该比较好理解

在MS-Windows或者X-Window系统的事件驱动模型中,当某些事件发生的时候,开发人员已经熟悉通过传递函数指针来调用处理方法。而在Java的面向对象的模型中,不能支持这种方法,因而看起来好像排除了使用这种比较舒服的机制,但事实并非如此。

Java的接口提供了一种很好的机制来让我们达到和回调相同的效果。这个诀窍就在于定一个简单的接口,在接口之中定义一个我们希望调用的方法。

举个例子来说,假设当一个事件发生的时候,我们想它被通知,那么我们定义一个接口:

4f1150b881333f12a311ae9ef34da474.pngpublicinterfaceInterestingEvent

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png//This is just a regular method so it can return something or

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png//take arguments if you like.d18c02628675d0a2c816449d98bda930.pngd18c02628675d0a2c816449d98bda930.pngpublicvoidinterestingEvent ();

d18c02628675d0a2c816449d98bda930.png

8f1ba5b45633e9678d1db480c16cae3f.png}

这就给我们一个控制实现了该接口的所有类的对象的控制点。因此,我们不需要关心任何和自己相关的其它外界的类型信息。这种方法比C函数更好,因为在C++风格的代码中,需要指定一个数据域来保存对象指针,而Java中这种实现并不需要。

发出事件的类需要对象实现InterestingEvent接口,然后调用接口中的interestingEvent ()方法。

4f1150b881333f12a311ae9ef34da474.pngpublicclassEventNotifier

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.pngprivateInterestingEvent ie;

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.pngprivatebooleansomethingHappened; 

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.pngpublicEventNotifier (InterestingEvent event)

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png//Save the event object for later use.d18c02628675d0a2c816449d98bda930.pngd18c02628675d0a2c816449d98bda930.png        ie=event; 

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png//Nothing to report yet.d18c02628675d0a2c816449d98bda930.pngd18c02628675d0a2c816449d98bda930.png        somethingHappened=false;

d18c02628675d0a2c816449d98bda930.png

ecedf933ec37d714bd4c2545da43add2.png    }d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png//9b8a8a44dd1c74ae49c20a7cd451974e.pngd18c02628675d0a2c816449d98bda930.pngd18c02628675d0a2c816449d98bda930.pngpublicvoiddoWork ()

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png//Check the predicate, which is set elsewhere.d18c02628675d0a2c816449d98bda930.pngd18c02628675d0a2c816449d98bda930.pngif(somethingHappened)

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png//Signal the even by invoking the interface's method.d18c02628675d0a2c816449d98bda930.pngd18c02628675d0a2c816449d98bda930.png            ie.interestingEvent ();

d18c02628675d0a2c816449d98bda930.png

ecedf933ec37d714bd4c2545da43add2.png        }d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png//9b8a8a44dd1c74ae49c20a7cd451974e.pngecedf933ec37d714bd4c2545da43add2.png}d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png//9b8a8a44dd1c74ae49c20a7cd451974e.pngd18c02628675d0a2c816449d98bda930.png8f1ba5b45633e9678d1db480c16cae3f.png}

在这个例子中,我们使用了somethingHappened这个标志来跟踪是否事件应该被激发。在许多事例中,被调用的方法能够激发interestingEvent()方法才是正确的。

希望收到事件通知的代码必须实现InterestingEvent接口,并且正确的传递自身的引用到事件通知器。

4f1150b881333f12a311ae9ef34da474.pngpublicclassCallMeimplementsInterestingEvent

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.pngprivateEventNotifier en; 

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.pngpublicCallMe ()

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png//Create the event notifier and pass ourself to it.d18c02628675d0a2c816449d98bda930.pngd18c02628675d0a2c816449d98bda930.png        en=newEventNotifier (this);

d18c02628675d0a2c816449d98bda930.png

ecedf933ec37d714bd4c2545da43add2.png    }d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png//Define the actual handler for the event.d18c02628675d0a2c816449d98bda930.pngd18c02628675d0a2c816449d98bda930.pngpublicvoidinterestingEvent ()

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png//Wow!  Something really interesting must have occurred!

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png//Do something

9b8a8a44dd1c74ae49c20a7cd451974e.pngd18c02628675d0a2c816449d98bda930.pngecedf933ec37d714bd4c2545da43add2.png    }d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png//9b8a8a44dd1c74ae49c20a7cd451974e.pngd18c02628675d0a2c816449d98bda930.png8f1ba5b45633e9678d1db480c16cae3f.png}

------------------------------

posted on 2008-02-17 12:25 siyn 阅读(868) 评论(1)  编辑  收藏 所属分类: java

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值