java 回调机制

软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。 

同步调用是一种阻塞式调用,调用 方要等待对方执行完毕才返回,它是一种单向调用; 

回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口; 

异步调用是一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口)。回调和异步调用的关系非常紧密,通常我们使用回调来实现异步消息的注册,通过异步调用来实现消息的通知。

 

回调测试代码:

interface Callback{
    void callback();
}

class Foo{
    private Callback callback;
    
    public void setCallBack(Callback callback){
        this.callback=callback;
    }

    public void doSth(){
        System.out.println("doing sth...");
        callback.callback();
    }
}

public class CallBackTest {

    public static void main(String[] args){
        Foo foo = new Foo();
        foo.setCallBack(new Callback() {
            
            @Override
            public void callback() {
                System.out.println("call back...");
            }
        });
        
        foo.doSth();
    }
}

 

 由此可以联想,咱们面向接口的编程的调用关系,当业务层调用数据层时,是不需要把业务层自身传递到数据层的,并且这是一种上层调用下层的关系,比如我们在用框架的时候,一般直接调用框架提供的API就可以了,但回调不同,当框架不能满足需求,我们想让框架来调用自己的类方法,怎么做呢?总不至于去修改框架吧。许多优秀的框架提几乎都供了相关的接口,我们只需要实现相关接口,即可完成了注册,然后在合适的时候让框架来调用我们自己的类,还记不记得我们在使用Struts时,当我们编写Action时,就需要继承Action类,然后实现execute()方法,在execute()方法中写咱们自己的业务逻辑代码,完成对用户请求的处理。由此可以猜测,框架和容器中会提供大量的回调接口,以满足个性化的定制。

 

因此通过回调的方式,就把一部分功能外包给别人,让别人个性化定制,至于别人怎么实现不管,我唯一要做的就是定义好相关接口,这一设计允许了底层代码调用高层定义的子程序,增强程序灵活性。

 

参考:

http://blog.csdn.net/pi9nc/article/details/23169357

http://hellosure.iteye.com/blog/1130176

 

posted @ 2014-07-15 10:47  jdflyfly  阅读(224)  评论(0编辑  收藏  举报