采用Client_Server模型理解回调callback

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

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

Client类:

package
com.cdl.callback.http0;

/**

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

*

*
@author [email protected]

*
@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 [email protected]

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

*/

public
class Server {

/**

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

*
所以对象B对client的使用可以看作是对象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:服务器响应失败!

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

第三方ICallBack接口:

package
com.cdl.callback.http1;

/**

*
功能:回调接口<BR>

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

*

*
@author [email protected]

*
@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 [email protected]

*
@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 [email protected]

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

*/

public
class Server {

/**

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

*
所以对象B对callBack的使用可以看作是对象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>

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

*

*
@author [email protected]

*
@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 [email protected]

*
@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 [email protected]

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

*/

public
class Server {

/**

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

*
所以对象B对callBack的使用可以看作是对象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:服务器响应失败!

时间: 2024-10-12 14:00:02

采用Client_Server模型理解回调callback的相关文章

[转] Java内部类之闭包(closure)与回调(callback)

闭包(closure)是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域.通过这个定义,可以看出内部类是面向对象的闭包,因为它 不仅包含外围类对象(创建内部类的作用域)的信息,还自动拥有一个指向此外围类对象的引用,在此作用城内,内部类有权操作所有的成员,包括private 成员. Java最引人争议的问题之一就是,人们认为Java应该包含某种类似指针的机制,以允许回调(callback).通过回调,对象能够携带一些信息,这些信息允许它在稍后的某个时刻调用初始的对象. 稍后将会看到

学习笔记:Caffe上LeNet模型理解

学习笔记:Caffe上LeNet模型理解 Caffe中用的模型结构是著名的手写体识别模型LeNet-5(http://yann.lecun.com/exdb/lenet/a35.html).当年美国大多数银行就是用它来识别支票上面的手写数字的.能够达到这种商用的地步,它的准确性可想而知,唯一的区别是把其中的sigmoid激活函数换成了ReLU. 为什么换成ReLU,上一篇blog中找到了一些相关讨论,可以参考. CNN的发展,关键就在于,通过卷积(convolution http://deepl

趁热打铁第二季《当下大部分互联网创业公司为什么都愿意采用增量模型来做开发?》

<当下大部分互联网创业公司为什么都愿意采用增量模型来做开发?> 这是为什么呢? 究其原因: (1)现在互联网技术日新月异,用户的需求也不是一成不变的.而增量模型的灵活性可以使其适应这种变化大大优于瀑布模型和快速原型模型.并且大部分公司还不能一下子就做出功能完善的的软件.所以采用增量模型来做开发是很符合软件开发潮流的. (2)现在软件开发越来越快,首先开发出具有核心功能的软件来快速占领市场,这样客户就很快有自己的用户量,占领一部分市场. (3)同时也能够加强用户与开发者,客户与用户的交流,以锲合

为什么浏览器采用多进程模型

为什么浏览器采用多进程模型 这个问题的答案似乎是非常清楚的,可以概括为:为了安全.稳定.性能,只是要牺牲点内存作为代价.对于安全和稳定,利用系统的进程机制就可以完成.但是多进程下的进程间通讯(IPC)很慢,而分为多进程后,一些协作任务就要分开到两个进程,如何能保持良好的性能,更不说比单进程模型更高的性能了? 所以这里再次探讨浏览器选择多进程架构的原因,以及对应架构中的要点. 多进程 vs. 多线程 先了解一下背景.将工作并行处理,是提高性能的手段.这个工作涉及到硬件,操作系统和应用程序.我不性硬

当下互联网创业公司采用增量模型的原因

3.当下大部分互联网创业公司为什么都愿意采用增量模型来做开发? ① 很多软件在开发之前并不知道或者说不完全知道用户的需求,采用增量模型,先发布一个基础软件,根据用户的使用反馈来总结用户需求,在原来的基础上完善软件的功能,这样既不会像瀑布模型一样在软件开发之前就要花大量的时间去做需求分析和管理,也不会做出不符合用户需求的无价值软件,既加快了软件开发步伐,又可以保证软件的质量. ② 用户的需求不稳定,可能会随时发生变化,再加上软件开发需要投入大量的资金,使用增量模型,如果用户评价不好,收入不好,可以

学习笔记-CIFAR10模型理解简述

学习笔记-CIFAR10模型理解简述 整个结构中包含三个convolution layer.三个pooling layer和两个fully connected layer. 每个层有多个Feature Map,每个Feature Map通过一种卷积滤波器提取输入的一种特征,然后每个Feature Map有多个神经元. 首先是数据层,测试数据100张为一批(batch_size),后面括号内是数据总大小.如100*32*32*3= 307200 Top shape: 100 3 32 32 (30

无敌回调callback

public interface OnClickCallBack {        void setType(long id);    } public void setCallBack(OnClickCallBack onClickCallBack){        this.onClickCallBack=onClickCallBack;    } 无敌回调callback

CSS盒模型 理解

每个元素(块级和内嵌)都会有个矩形盒子,这个盒子为元素盒,盒子的中间(center)为元素的内 容,center区域内的距离为元素的高度(height).宽度(width).在盒模型中 padding就是内容 (center)与边框(border)的空隙区域,而margin 则是边框(border)外的空隙区域.元素的背景颜 色和背景图像在内边框(padding)区域是可见的,并且延生到border下面:元素的外边框(maegin)区 域总是透明的,所有父级元素的背景能看见. 盒内距离表示例如:

border,padding,margin盒模型理解

安静的敲着键盘,已势不可挡的姿势逼近php,我想我是一个幸福的人,未来不可期,做好现在,偶尔写着自己能看懂的API,慢慢悠悠的回味一下前端基础知识. 本文盒模型理解. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>border,padding,margin盒模型理解</title> <style&