4

考虑以下一般程序结构:

  • A 类有一个 B 类的实例作为成员变量
  • B 类有一个包含 C 类实例的集合成员变量
  • A 类中的事件通过 A 简单地告诉 B 事件传播到 C 实例

关于 C 类实例与 A 类对话的设计模式是什么?

一种选择是 C 类发布 A 类订阅的通知的实例。另一种选择是将对 A 类的引用传递给“链下”(从 A 到 B,然后从 B 到每个 C)。后一种选择允许 C 的实例直接与 A 对话。

4

1 回答 1

3

如果您的意思是字面上的设计模式(即 GoF 种类),那么这些将是一些相关的选项:

  • 命令:将回调传递给C项目(直接或间接通过 B),以便当他们想要回话时,A他们可以简单地调用这个回调——甚至可以有参数
  • 迭代器:B将其聚合集合的视图直接暴露给A; A然后C直接进行通信
  • 中介者:公开AC可能订阅的通知;交流是通过发布事件来完成的
  • 观察者:你已经建议的第一个选项

另一方面,如果您真的是指架构模式,那么典型的选项是:

  • 您的第一个选择,A订阅C事件。乍一看,这似乎不是一个全面的好主意,除非事件一直非常有用,因为它需要n对象将指针聚合回回调,在最坏的情况下它们甚至可以只使用一次。
  • 传递引用A是另一种选择,但如果您要污染A方法的公共接口以便C在非常特定的场景中回调它,则不是一个好的选择。如果已经公开了合适的接口,它可能非常有效A,但请注意,您可能需要在C回调之间使用适配器类A,以便不紧密耦合CA的接口。
  • 第三种选择是A迭代直接提供的集合(视图)并向实例B提供回调;C这具有非常松散耦合的优点,并且它将使用最少的内存量,但编码可能有点棘手。
于 2012-04-15T02:07:58.220 回答