对软件设计中回调机制的理解 设计模式回调
调用方式
模块之间的通信,总是存在一定的调用。从调用方式上来看,可以分为两种:同步调度、异步调用。
同步调度:即阻塞调用,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种设计模式中没有叫回调模式的,如果非要归为某一类,它其实就是观察者模式,只不过观察者只一个而已。。。