【问题标题】:Code Design - Including listeners/events in contract代码设计 - 在合约中包含监听器/事件
【发布时间】:2023-03-10 14:20:01
【问题描述】:

假设有一个模块 A 使得模块 B 和 C 依赖于它。模块 A 支持侦听器模式,即像 B 和 C 这样的模块可以侦听 A 生成的事件。因此,模块 A 与其侦听器分离。现在我们希望有一些合约(Java 中的接口)可以共同定义模块 A 的合约。

问题是在合约中插入监听器。我应该在合同中添加“public addListener(Listener listener)”之类的功能吗?另一种方法是使用实​​现侦听器部分的抽象类并将其他功能保留为抽象。我真的不想扩展类,因为在某个时候,如果我们决定在一个类中实现两个合同,那么这是不可能的。您能否讨论上述案例,并感谢您对相关主题的任何见解。

为什么我想要合同中的听众?这是因为如果有一天有人重写模块 A,听 A 的模块不应该分解。如果这不是一个好主意,请告诉我。

编辑:问题之一是我想让监听器/事件成为合同的一部分,以便可以轻松地完成未来的更改/重新实现。模块 A 早些时候触发了特定事件 E 不应该发生,但现在新的实现将其变为事件 B,因为程序员不知道事件(因为它不是合同的一部分)。这种方法的一个问题是我强迫程序员触发这些事件并使用基于事件的系统。

【问题讨论】:

    标签: java oop design-patterns


    【解决方案1】:

    我肯定会根据侦听器接口定义 A,使用 addListener(可能还有 removeListener)公共方法和受保护的 notifyListeners 方法(或者可能更多,取决于侦听器接口的复杂性)。

    请注意,模块 B 和 C 也可能不实现侦听器接口;他们可以使用单独的侦听器对象(甚至可能是匿名内部类)。

    一般来说,我不会实现抽象侦听器类;将其留给每个侦听器实现。如果侦听器接口声明了许多方法,但并非所有方法都适用于任何特定客户端,则例外情况。然后,实现一个对每个方法都不执行任何操作的基侦听器类可能会很有用。例如,可以通过 java.awt.MouseAdapter 类看到这种方法,该类实现了各种与鼠标相关的侦听器接口。

    【讨论】:

      【解决方案2】:

      Ovserver 模式是一种很好的解耦方式。

      在 observalble 类中添加 addListener 和 removeListeners 方法不是一个好主意,因为它会导致代码重复(如果没有使用抽象实现)。

      更好的解决方案是定义具有两个方法addListener、removeListener 和fireEvent 方法的Registration 类。 在这种情况下,Obeservable 类将只实现接口,例如 MyObservable 等等。

      以下链接将帮助您了解有关注册课程的更多信息: EventBus in Java

      【讨论】:

      • 问题是我想让监听器/事件成为合同的一部分,以便将来的更改/重新实现可以轻松完成。模块 A 早些时候触发了特定事件 E 不应该发生,但现在新的实现将其变为事件 B,因为程序员不知道事件(因为它不是合同的一部分)。一个问题是我强迫程序员触发这些事件并使用基于事件的系统。另外,感谢 EventBus 链接。
      • 发布者和订阅者之间必须有合同。否则,如果发布者发布了某些内容,订阅者将无法理解。订阅事件时可以使用 Java 泛型。如果存在合同违约,这将导致编译错误。
      猜你喜欢
      • 1970-01-01
      • 2021-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-01
      • 1970-01-01
      相关资源
      最近更新 更多