gpt4 book ai didi

design-patterns - "controller"和 "gui"之间的循环依赖

转载 作者:行者123 更新时间:2023-12-04 07:04:53 26 4
gpt4 key购买 nike

我正在用 Java 编写一个复杂的 GUI,其中有多个屏幕上的许多组件在共享的逻辑和模型上工作并与之交互。显然,“gui”和“ Controller /逻辑”之间存在一些循环依赖关系:GUI 中的用户操作被转发给 Controller , Controller 执行一些任务,然后需要在所有 GUI 中反射(reflect)这些变化。后台可能会发生一些事情,使 Controller 将更新推送到 GUI。等等。

现在,这是我的问题。监听器或观察者模式非常适合将更新推送到 GUI。让我的 GUI 直接依赖于具体的 Controller 类可以吗?为什么/为什么不?只有一个这样的 Controller (并且永远都会有)。 GUI 需要十几个 Controller 调用来轮询状态和执行操作——我不喜欢少数微不足道的回调接口(interface)总是只有一个实现,也不是一个巨大的回调接口(interface)。种 Action 。

最佳答案

Is it OK to make my GUI depend on a concrete controller class directly? Why/why not?



否:因为 loose coupling是良好设计的基础。依赖于抽象。依赖于实现使得不可能在不重新编译依赖项的情况下将一个实现替换为另一个实现。紧密耦合任何两个类都会阻碍 future 的灵 active 。

是的:这是一个判断电话。如果松耦合肯定没有 future 的好处,而且成本太高而无法证明是合理的,那就耦合吧。

但真的尽量不要。让 GUI 依赖于 Controller 是一个有效的设计决策。但总是依赖于抽象,而不是实现。来吧……你知道的。我的意思是,好吧,如果没有人想关掉 Controller ,那么你就没有通过使用界面获得任何东西。除了安心,知道您编写的代码更整洁、耦合更少。并且可以说更容易测试。

至于如何选择 GUI 和 Controller 之间的通信方式,这是一个折腾。您可以使用事件,但将它们连接起来很麻烦,而且它们不会跨越应用程序边界。但是通过使用事件,您可能会觉得您拥有最松散的耦合。 GUI 和 Controller 从不需要相互寻址(抽象),除非最初连接事件。那感觉可能不错。或者您可以对接口(interface)使用方法调用,这可能感觉是一种稍微紧密的耦合,但实际上几乎没有什么不同。不管你怎么做,X 都必须知道关于 Y 的事情才能让他们交流。

GUI 和 Controller 之间的循环依赖是可以的(在抽象上!)。 MVC 模式有很多变体。每次我使用它时,我都会根据我的需要/心情来塑造它。也就是说,我确实尝试 避免循环依赖。我更喜欢将依赖关系限制在一个方向。或者根本没有!

例如,在我当前的项目中, Controller 知道 View ,但 View 完全不知道 Controller 退出。 Controller 订阅 View 的事件,并通过 View 绑定(bind)到的单个状态对象将数据传回给它们。状态类是 View 唯一依赖的东西。 Controller 只知道 View 的接口(interface)和状态对象的类型。并且这些东西是在外部模块中定义的,因此可以完全删除 View 模块并且 Controller 仍然可以编译,反之亦然。这是一个非常松散的耦合。几乎没有(双方都依赖于第三个模块)。

有些人会反其道而行之。

避免具体依赖的原因
  • 很难将一个实现换成另一个 - 依赖可能需要修改或至少重新编译
  • 更难维护 - 不能相互独立地修改组件
  • 更难单独测试 - 需要修改和重新编译依赖项以交换依赖项的模拟实现
  • 关于design-patterns - "controller"和 "gui"之间的循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7987156/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com