码迷,mamicode.com
首页 > 其他好文 > 详细

采用Client_Server模型理解回调callback

时间:2015-03-01 10:30:35      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:

定义:如果对象A调用对象B称为【顺调】,那么在对象A调用对象B之后,对象B再调用对象A,这时对象B对对象A的调用称为【回调】


第一种:对象A和对象B相互直接调用

Client类:

package com.cdl.callback.http0;

/**

* 功能:为了便于描述,把Client称作对象A

*

* @author ocaicai@yeah.net

* @date 2012-4-22 上午10:45:30

*/

public class Client {

public static void main(String[] args) {

Server server = new Server();

//A调用B,将自己传递过去,以便于B直接回调

server.doRequest(new Client());

}

public void doResponse(boolean result) {

if(result){

System.out.println("Client Side:服务器响应成功!");

}else{

System.out.println("Client Side:服务器响应失败!");

}

}

}


Server类:

package com.cdl.callback.http0;

import java.util.Random;

/**

* 功能:为了便于描述,把Server称作对象B<BR>

* 定义:如果对象A调用对象B称为【顺调】,<BR>

* 那么在对象A调用对象B之后,对象B再调用对象A,这时对象B对对象A的调用称为【回调】<BR>

*

* @author ocaicai@yeah.net

* @date 2012-4-22 上午10:46:05

*/

public class Server {

/**

* 由于client是对象A调用对象B时传递过来的参数<BR>

* 所以对象Bclient的使用可以看作是对象B对对象A的调用,即是回调:对象B再调用对象A

*

* @param client

* 对象A调用对象B时传递过来的参数

*/

public void doRequest(Client client) {

boolean result = getDoRequestResult();

client.doResponse(result);

}

private boolean getDoRequestResult() {

System.out.println("Server Side:服务器正在处理客户端的请求...");

int status = Math.abs(new Random().nextInt());

return status % 2 == 0 ? false : true;

}

}


运行结果1

Server Side:服务器正在处理客户端的请求...

Client Side:服务器响应成功!

运行结果2

Server Side:服务器正在处理客户端的请求...

Client Side:服务器响应失败!


第二种:借助第三方隔离ClientServer,避免它们之间的直接相互依赖

第三方ICallBack接口:

package com.cdl.callback.http1;

/**

* 功能:回调接口<BR>

* 借助第三方隔离ClientServer,避免它们之间的直接相互依赖<BR>

*

* @author ocaicai@yeah.net

* @date 2012-4-22 上午10:07:18

*/

public interface ICallBack {

public void onSuccess();

public void onFailure();

}


Client类:

package com.cdl.callback.http1;

/**

* 功能:为了便于描述,把Client称作对象A

*

* @author ocaicai@yeah.net

* @date 2012-4-22 上午10:45:30

*/

public class Client {

public static void main(String[] args) {

Server server = new Server();

//如果直接传递自己,这样的依赖性太大,所以采用接口

server.doRequest(new ICallBack() {

@Override

public void onSuccess() {

System.out.println("Client Side:服务器响应成功!");

}

@Override

public void onFailure() {

System.out.println("Client Side:服务器响应失败!");

}

});

}

}


Server类:

package com.cdl.callback.http1;

import java.util.Random;

/**

* 功能:为了便于描述,把Server称作对象B<BR>

* 定义:如果对象A调用对象B称为【顺调】,<BR>

* 那么在对象A调用对象B之后,对象B再调用对象A,这时对象B对对象A的调用称为【回调】<BR>

*

* @author ocaicai@yeah.net

* @date 2012-4-22 上午10:46:05

*/

public class Server {

/**

* 由于callBack是对象A调用对象B时传递过来的参数<BR>

* 所以对象BcallBack的使用可以看作是对象B对对象A的调用,即是回调:对象B再调用对象A

*

* @param callBack

* 对象A调用对象B时传递过来的参数

*/

public void doRequest(ICallBack callBack) {

boolean result = getDoRequestResult();

if (result)

callBack.onSuccess();

else

callBack.onFailure();

}

 

private boolean getDoRequestResult() {

System.out.println("Server Side:服务器正在处理客户端的请求...");

int status = Math.abs(new Random().nextInt());

return status % 2 == 0 ? false : true;

}

}


运行结果1

Server Side:服务器正在处理客户端的请求...

Client Side:服务器响应失败!

运行结果2

Server Side:服务器正在处理客户端的请求...

Client Side:服务器响应成功!


第三种:第三方接口可能需要负责传递数据,为了通用性采用泛型(广泛使用的类型)

ICallBack接口:

Java代码

package com.cdl.callback.http2;

/**

* 功能:回调接口,加上了一个泛型 <BR>

* 借助第三方隔离ClientServer,避免它们之间的直接相互依赖<BR>

*

* @author ocaicai@yeah.net

* @date 2012-4-22 上午10:07:18

*/

public interface ICallBack<T> {

public void onSuccess(T result);

public void onFailure();

}


Client类:

package com.cdl.callback.http2;

/**

* 功能:为了便于描述,把Client称作对象A

*

* @author ocaicai@yeah.net

* @date 2012-4-22 上午10:45:30

*/

public class Client {

public static void main(String[] args) {

Server server = new Server();

server.doRequest(new ICallBack<String>() {

@Override

public void onSuccess(String result) {

System.out.println("Client Side:服务器响应成功!");

System.out.println(result);

}

@Override

public void onFailure() {

System.out.println("Client Side:服务器响应失败!");

}

});

}

}


Server类:

package com.cdl.callback.http2;

import java.util.Random;

/**

* 功能:为了便于描述,把Server称作对象B<BR>

* 定义:如果对象A调用对象B称为【顺调】,<BR>

* 那么在对象A调用对象B之后,对象B再调用对象A,这时对象B对对象A的调用称为【回调】<BR>

*

* @author ocaicai@yeah.net

* @date 2012-4-22 上午10:46:05

*/

public class Server {

/**

* 由于callBack是对象A调用对象B时传递过来的参数<BR>

* 所以对象BcallBack的使用可以看作是对象B对对象A的调用,即是回调:对象B再调用对象A

*

* @param callBack

* 对象A调用对象B时传递过来的参数

*/

public void doRequest(ICallBack<String> callBack) {

boolean result = getDoRequestResult();

if(result)

callBack.onSuccess("服务器Message:谢谢客户端的访问!");

else

callBack.onFailure();

}

private boolean getDoRequestResult() {

System.out.println("Server Side:服务器正在处理客户端的请求...");

int status = Math.abs(new Random().nextInt());

return status % 2 == 0 ? false : true;

}

}


运行结果1

Server Side:服务器正在处理客户端的请求...

Client Side:服务器响应成功!

服务器Message:谢谢客户端的访问!

运行结果2

Server Side:服务器正在处理客户端的请求...

Client Side:服务器响应失败!  

采用Client_Server模型理解回调callback

标签:

原文地址:http://www.cnblogs.com/lin-lin/p/4306605.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!