因此,对于我当前的项目,基本上有三个主要的Java类:
基本上,需要进行完全的沟通,因此我们决定使用中介方法而不是允许GUI运行整个项目。
基本上,调解员将封装通信。我们遇到的问题是如何允许GUI组件更新,而无需构建大量的方法让调解器随时调用完成。
实施例。假设GUI想要登录用户,它会通过介体创建一个线程并登录,但是介体必须将成功/失败转发回GUI并更新状态消息。
另一个问题是需要更新GUI但不需要主持人的事情。允许GUI创建该类的实例并运行它或者是否所有内容都通过调解器是否切实可行?
我们的原始设计只是让GUI管理所有内容,但它确实杀死了可重用性。在这种情况下是否有更好的设计方法?
答案 0 :(得分:3)
如果你发现Observer带来了太多的开销,Mediator可能是最好的方法。我绝对认为你不应该让GUI运行这个节目。如果您打算使用Mediator模式,调解员本身应该负责。您可能会考虑的是Command模式的变体。如果您使用的是Ruby,我可能会建议传递函数回调,以避免让调解器为每个小东西联系GUI。但由于它是Java,因此在命令模式样式中封装动作的某种形式可能有所帮助。
答案 1 :(得分:0)
如果您不希望调解器触发回调/通知,您可以将回调注入登录功能,并在完成后登录调用。
我不知道如何在Java中注入回调。在一个函数是一等公民的语言中,你可以只传递函数,但你是Java,所以我猜你必须使用命令模式作为kmorris建议。
答案 2 :(得分:0)
您也可以尝试让GUI为调解器提供一个回调对象,该对象处理检索返回值或设置您需要的任何值(Command模式的一个版本)。然后,从GUI到调解器的每次调用都会有一个。
另一个想法是将介体调用的方法分组为语义相关的块。特别是如果介体具有可以连续调用多个GUI方法的部分:
gui.a()
gui.b()
gui.c()
您可以创建一个处理调用所有三个结果的方法。语法分组方法的优势(即setFileInformation
超过setFileMenu
,setTab
等)也是如果你需要更改GUI,方法的内容可能会改变,但是打电话给调解员可能没有。