3

所以对于我目前的项目,基本上有三个主要的 Java 类:

  1. 图形用户界面
  2. 即时通讯
  3. 计算

本质上,需要充分的沟通,所以我们决定使用中介方法,而不是让 GUI 运行整个项目。

基本上,中介将封装通信。我们遇到的问题是如何允许 GUI 组件更新,而无需构建大量方法供中介在任何事情完成时调用。

前任。假设 GUI 想要登录用户,它通过中介创建一个线程并登录,但是中介必须将成功/失败转发回 GUI 并更新状态消息。

另一个问题是需要更新 GUI 但不需要主持人的事情。只允许 GUI 创建该类的实例并运行它是否可行,或者一切都应该通过中介?

我们最初的设计只是让 GUI 管理一切,但它确实扼杀了可重用性。在这种情况下是否有更好的设计方法可以使用?

4

3 回答 3

3

如果您发现 Observer 会带来太多开销,那么 Mediator 可能是最好的选择。我绝对认为您不应该让 GUI 运行该节目。如果你打算使用中介者模式,中介者本身应该负责。您可能会考虑的是命令模式的一种变体。如果您使用的是 Ruby,我可能会建议您传递函数回调,以避免让中介者为每一件小事联系 GUI。但由于它是 Java,某种形式的以命令模式样式封装动作可能会有所帮助。

于 2009-06-08T15:58:19.280 回答
0

您也可以尝试让 GUI 为中介者提供一个回调对象,该对象处理检索返回值或设置您需要的任何值(命令模式的一个版本)。然后,从 GUI 到中介的每次调用都会有一个。

另一个想法是将中介调用的方法分组到语义相关的块中。特别是如果中介有部分倾向于连续调用多个 GUI 方法:

   gui.a()
   gui.b()
   gui.c()

您可以创建一个方法来处理调用所有三个的结果。语义分组方法(即setFileInformationover setFileMenusetTab等)的优点还在于,如果您需要更改 GUI,方法的内容可能会更改,但调解器进行的调用可能不会更改。

于 2009-06-08T16:25:59.573 回答
0

如果您不希望中介触发回调/通知,您可以将回调注入到登录函数中,并在完成时让登录调用它。

不过,我不知道您将如何在 Java 中注入回调。在函数是一等公民的语言中,您可以只传递函数,但您使用的是 Java,所以我想您将不得不使用 kmorris 建议的命令模式。

于 2009-06-08T16:04:08.627 回答