调用方式
模块之间的通信,总是存在一定的调用。从调用方式上来看,可以分为两种:同步调度、异步调用。
同步调度:即阻塞调用,A调用B,A会等待B执行完,A所在线程会阻塞,属于双向通信
异步调用:当前线程不阻塞,A调用B后继续往下执行。如果A需要B的返回,则B在执行完成后要调用A,这就是回调,属于双向通信。如果A不需要B的返回,属于单向通信
java的回调机制
诸如javascript、actionscript等脚本语言,函数可以作为参数来传递,所以通过将函数作为参数,就可以实现回调。如:
//注册鼠标按下时的事件回调
this.addEventListen(MouseEvent.MOUSE_DOWN,onMouseDownHandler);
/**
* 当鼠标按下时的事件处理
*/
function onMouseDownHandler(MouseEvent e)
{
}
但java却不能将方法作为一个参数来传递,但是java的参数可以是一个引用,正好java可以通用它来实现回调,下面将通过一个例子来实现。
package com.wxj.callback;
/**
* 回调接口
* @author Administrator
*
*/
public interface ICallback
{
public void execute(ResponseContext context);
}
package com.wxj.callback;
/**
* 回调结果
* @author Administrator
*
*/
public class ResponseContext
{
/**
* 状态
*/
private int status;
/**
* 描述消息
*/
private String message;
public int getStatus()
{
return status;
}
public void setStatus(int status)
{
this.status = status;
}
public String getMessage()
{
return message;
}
public void setMessage(String message)
{
this.message = message;
}
}
package com.wxj.callback;
/**
* 业务逻辑
* @author Administrator
*
*/
public class Business
{
private ICallback callback;
public Business(ICallback callback)
{
this.callback = callback;
}
/**
* 执行具体的业务逻辑
*/
public void work()
{
System.out.println("work");
ResponseContext context = new ResponseContext();
context.setStatus(1);
context.setMessage("执行成功");
//回调
callback.execute(context);
}
}
package com.wxj.callback;
/**
* 测试类
* @author Administrator
*
*/
public class TestCallback
{
public static void main(String[] args)
{
Business biz = new Business(new ICallback()
{
@Override
public void execute(ResponseContext context)
{
if(context.getStatus() == 1)
{
System.out.println("业务执行成功");
}
}
});
biz.work();
}
}
回调在开源项目中的应用
回调模式在zookeeper中随机可见,比如连接zookeeper,
ZooKeeper zk = new ZooKeeper("127.0.0.1:2181", 500000,new Watcher()
{
public void process(WatchedEvent event)
{
//连接成功后做的相关处理
}
});
Watch是zookeeper的核心
小结
回调是一种常见的设计模式,但23种设计模式中没有叫回调模式的,如果非要归为某一类,它其实就是观察者模式,只不过观察者只一个而已。。。