如何在Java中实现回调

Nik*_*lin 10 asynchronous callback

我有一个名为CommunicationManager的类,它负责与服务器的通信.

它包括方法login()onLoginResponse().在用户登录的情况下,login()必须调用该方法,并且当服务器响应时,onLoginResponse()执行该方法.

我想要做的是将动作与用户界面绑定.在GUI类中,我创建了一个名为CommunicationManager的实例mCommunicationManager.从GUI类开始,该login()方法简单地由行调用

mCommunicationManager.login();
Run Code Online (Sandbox Code Playgroud)

我不知道怎么做是将方法从GUI类绑定到onLoginResponse().例如,如果GUI类包括notifyUser()显示从服务器接收的消息的方法.

我真的很感激,当类GUI.notifyUser()的实例mCommunicationManager从服务器接收消息并执行方法时,任何人都可以展示如何绑定方法以便从GUI类(例如)CommunicationManager.onLoginResponse()执行方法.

谢谢!

wds*_*wds 25

我可以看到你使用的两种模式.一个是Pete提到的发布/订阅或观察者模式.我想这可能是你想要的,但是看到问题提到绑定一个方法以便以后执行,我想我应该提一下Command模式.

Command模式基本上是一个解决方案,因为java不会将方法(函数)视为第一类对象,因此无法传递它们.相反,您可以创建一个可以传递的接口,并封装有关如何调用原始方法的必要信息.

所以对于你的例子:

 interface Command {
     public void execute();
 }
Run Code Online (Sandbox Code Playgroud)

然后在执行login()函数时传入此命令的实例(未经测试,我总是忘记如何正确获取匿名类):

 final GUI target = this;
 command = new Command() {
     @Override
     public void execute() {
         target.notifyUser();
     }
 };
 mCommunicationManager.login(command);
Run Code Online (Sandbox Code Playgroud)

并在login()函数中(管理器保存对命令的引用):

public void login() {
    command.execute();
}
Run Code Online (Sandbox Code Playgroud)

编辑:我应该提一下,虽然这是它如何工作的一般解释,但在Java中已经存在一些用于此目的的管道,即ActionListener相关类(actionPerformed()基本上是execute()in Command).这些主要用于AWT和/或Swing类,因此具有特定于该用例的特征.