我有一个名为CommunicationManager的类,负责与服务器通信。
它包含方法login()
和onLoginResponse()
。在用户登录的情况下,必须调用方法login()
,并且当服务器响应时,执行方法onLoginResponse()
。
我想要做的是将操作与用户界面绑定。在GUI类中,我创建了一个名为mCommunicationManager
的CommunicationManager实例。从GUI类中,login()
方法只是由行
mCommunicationManager.login();
我不知道如何将方法从GUI类绑定到onLoginResponse()
。例如,如果GUI类包含显示从服务器接收的消息的方法notifyUser()
。
我真的很感激,当类GUI.notifyUser()
的实例从服务器收到消息时,是否有人可以展示如何绑定方法以便从GUI类(例如mCommunicationManager
)执行该方法并执行方法CommunicationManager.onLoginResponse()
。
谢谢!
答案 0 :(得分:25)
我可以看到你使用的两种模式。一个是皮特提到的publish/subscribe or observer pattern。我认为这可能是你想要的,但是看到问题提到绑定一个方法以便以后执行,我想我应该提到Command pattern。
Command模式基本上是一个解决方案,因为java不会将方法(函数)视为第一类对象,因此无法传递它们。相反,您可以创建一个可以传递的接口,并封装有关如何调用原始方法的必要信息。
所以对你的例子来说:
interface Command {
public void execute();
}
然后在执行login()
函数时传入此命令的实例(未经测试,我总是忘记如何正确获取匿名类):
final GUI target = this;
command = new Command() {
@Override
public void execute() {
target.notifyUser();
}
};
mCommunicationManager.login(command);
在login()函数中(管理器保存对命令的引用):
public void login() {
command.execute();
}
编辑:
我应该提一下,虽然这是它如何工作的一般解释,但在Java中已经存在一些用于此目的的管道,即ActionListener
和相关类(actionPerformed()
基本上是{{1在execute()
)中。这些主要用于AWT和/或Swing类,因此具有特定于该用例的特性。
答案 1 :(得分:3)
Java中用于实现回调行为的习惯是Listeners。使用所需事件的方法构造一个接口,具有一个用于将侦听器对象注册到事件源的机制。发生事件时,请在每个已注册的侦听器上调用相应的方法。这是AWT和Swing事件的常见模式;对于随机选择的示例,请参阅FocusListener和相应的FocusEvent对象。
请注意,Java AWT和Swing中的所有事件都最终从EventObject继承,惯例是调用侦听器SomethingListener
和事件SomethingEvent
。虽然您可以随心所欲地命名代码,但是维护代码更容易遵守平台的惯例。
答案 2 :(得分:1)
你可以看一下swt-snippets(看一下听众)
http://www.eclipse.org/swt/snippets/
或者你使用runnable类,在创建实例时用'callback'代码覆盖run方法
答案 3 :(得分:1)
据我所知,Java不支持方法绑定或C#之类的委托。
您可能必须通过接口实现此功能(例如,像Command listener。)。
也许这个网站会有所帮助:
http://www.javaworld.com/javaworld/javatips/jw-javatip10.html