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类,因此具有特定于该用例的特征.