回调函数

以一个现实的例子开头:假设你公司的总经理出差前需要你帮他办件事情,这件事情你需要花些时间去做,这时候总经理肯定不能守着你做完再出差吧,于是就他告诉你他的手机号码叫你如果事情办完了你就打电话告诉他一声;这是一个现实生活中常能碰到的例子,我们用呢就用代码的方式来实现一个这个过程,看一下这个过程究竟是怎样的。

首先在Eclipse中新建一个Java项目:CallBackDemoInJava;

然后再新建三个类:Manager(该类用来模拟总经理)、Personnel(该类用来模拟员工)、Main(主类); 

package com.test;  
  
/** 
 * @description 该类用来模拟总经理 
 */  
public class Manager {  
    /** 
     * @param personnel 
     *            传入一个员工类的对象 
     */  
    public Manager(Personnel personnel) {  
  
        // 想让该让员工做什么  
        personnel.doSomething(this, "整理公司文件");  
    }  
  
    /** 
     * @description 当员工做完总经理让他做的事后就通过该方法通知总经理 
     * @param result 
     *            事情结果 
     */  
    public void phoneCall(String result) {  
        System.out.println("事情" + result);  
    }  
}  

Manager类是个模拟总经理的类,当该类的对象被造出来后就会通过Personnel的对象去执行Personnel中的doSomething方法告诉员工做些什么 。若让员工做完事情后直接用自己的电话通知是没有实现回调

Personnel的代码如下:

package com.test;  
  
/** 
 * @description 该类用来模拟员工 
*/
public class Personnel {  
    public void doSomething(Manager manager, String task) {  
  
        // 总经理通过doSomething方法告诉员工要做什么  
        System.out.println("总经理要你做" + task);  
  
        String result = "做完了";  
  
        // 当事情做完了我们就通过总经理公布的phoneCall方法通知总经理结果  
        manager.phoneCall(result);  
    }  
}  

总经理通过调用Personnel中的doSomething方法告诉员工该做些什么,当员工做完后就通过Manager中的phoneCall方法通知总经理结果

那么好的!万事俱备,我们在Main中测试运行下代码看看结果

package com.test;  
  
public class Main {  
    public static void main(String[] args) {  
        // 首先我们需要一个员工  
        Personnel personnel = new Personnel();  
  
        // 其次把这个员工指派给总经理  
        new Manager(personnel);  
    }  
}  

代码执行结果如下

回到我们刚才举的那个现实中的例子:总经理出差前要你去办件事情,这件事情通过doSomething告诉你了,事情要是办完了就打总经理的电话phoneCall通知他一声。这里的phoneCall我们就称为回调方法,为什么称之为回调呢?你问我我也不清楚哈~这你得问Sun公司了,不过我们从代码的执行过程可以看出数据的流向大致是Manager—–>Personnel—–>Manager,这不就是一个“回调”的过程么?现在我们来总结下满足回调的两个基本条件:

  1. Class A调用Class B中的X方法
  2. ClassB中X方法执行的过程中调用Class A中的Y方法完成回调

以上例子代码简单通俗地描述了回调,但是这里我就会有这样一个疑问:假设总经理出差前交了件事情给我去办,不巧……副总经理也要给我件事去办,更无耻的是……主管也发任务过来了,都要求说做完就打电话通知他们……这时我们就要定义更多类,什么总经理类啦~经理类啦~主管类啦~杂七杂八的类,但是这些杂七杂八的大爷们都要求做完事情就电话通知,每个类都会有一个类似phoneCall的方法作为回调方法,这时,我们利用面向对象的思想来看~是不是可以把这个回调方法抽象出来作为一个独立的抽象类或接口呢?多态的思想油然而生~~~鉴于JAVA接口的好处,我们就定义一个名为CallBack的接口作为回调接口,再在该接口下定义一个名为backResult的抽象方法作为回调方法,让那些总经理类啦~经理类啦~主管类啦~什么的都去实现该接口,这时候我们就来改造下我们的项目:

CallBack代码如下:

interface CallBack{
    public  void backResult(String result);
}

Manager代码如下:

package com.test;  
  
/** 
 * @description 该类用来模拟总经理 
*/
public class Manager implements CallBack {  
    /** 
     * @param personnel 
     *            传入一个员工类的对象 
     */  
    public Manager(Personnel personnel) {  
  
        // 想让该让员工做什么  
        personnel.doSomething(this, "整理公司文件");  
    }  
  
    /** 
     * @description 当员工做完总经理让他做的事后就通过该方法通知总经理 
     * @param result 
     *            事情结果 
     */  
    public void backResult(String result) {  
        System.out.println("事情" + result);  
    }  
}  

Personnel代码改造后如下:

doSomething方法不再传入一个Manager对象而是一个CallBack接口:

package com.test;  
  
/** 
 * @description 该类用来模拟员工 
 */  
public class Personnel {  
    public void doSomething(CallBack callBack, String task) {  
        // 总经理通过doSomething方法告诉员工要做什么  
        System.out.println("总经理要你做" + task);  
  
        String result = "做完了";  
  
        // 当事情做完了我们就通过总经理公布的phoneCall方法通知总经理结果  
        callBack.backResult(result);  
    }  
}  

具体而言,应先定义一个接口,然后在接口中声明要调用的方法,接着实现这个接口,然后把这个实现类的一个对象作为参数传递给调用程序,调用程序来调用通过这个参数来调用指定的函数,从而实现回调函数的功能java面试宝典

转载自https://blog.youkuaiyun.com/jiayi_yao/article/details/51046526

WebSocket是一种在客户端和服务器之间建立持久连接的协议,它允许双方进行双向通信,极大地提高了实时性,被广泛应用于即时通讯、在线游戏、股票交易等领域。本篇将详细讲解如何使用C#来实现WebSocket,以及Fleck库在其中的作用。 WebSocket协议基于HTTP的握手过程,但一旦连接建立,它就不再依赖HTTP,而是通过TCP直接通信。在C#中,我们可以利用.NET Framework或.NET Core提供的System.Net.WebSockets命名空间来创建WebSocket服务器和客户端。然而,对于更高级的功能和更好的灵活性,开发者通常会选择第三方库,如Fleck。 Fleck是C#中一个轻量级且高效的WebSocket服务器实现。它提供了丰富的事件驱动API,使得开发者可以轻松地处理WebSocket连接的建立、消息传递和断开等操作。下面我们将探讨Fleck的使用步骤: 1. **安装Fleck**:你需要在你的项目中添加Fleck库。如果你使用的是NuGet包管理器,可以通过搜索"Fleck"并安装来获取。 2. **初始化服务器**:在C#代码中,首先创建一个Fleck服务器实例,指定监听的IP地址和端口号。例如: ```csharp var server = new Fleck.WebSocketServer("ws://localhost:8080"); ``` 3. **配置服务器**:你可以设置各种配置选项,如最大接收/发送缓冲区大小、心跳间隔等。然后注册事件处理器,如OnOpen、OnClose、OnMessage等,以处理客户端连接、断开和消息接收。 4. **连接事件**:`OnOpen`事件在客户端连接时触发,你可以在这里对新连接进行初始化操作,如存储连接信息、验证用户等。 5. **消息处理**:`OnMessage`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值