对软件设计中回调机制的理解

调用方式

       模块之间的通信,总是存在一定的调用。从调用方式上来看,可以分为两种:同步调度、异步调用。

同步调度:即阻塞调用,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种设计模式中没有叫回调模式的,如果非要归为某一类,它其实就是观察者模式,只不过观察者只一个而已。。。

猜你喜欢

转载自jxauwxj.iteye.com/blog/2356722