考虑以下一般程序结构:
- A 类有一个 B 类的实例作为成员变量
- B 类有一个包含 C 类实例的集合成员变量
- A 类中的事件通过 A 简单地告诉 B 事件传播到 C 实例
关于 C 类实例与 A 类对话的设计模式是什么?
一种选择是 C 类发布 A 类订阅的通知的实例。另一种选择是将对 A 类的引用传递给“链下”(从 A 到 B,然后从 B 到每个 C)。后一种选择允许 C 的实例直接与 A 对话。
考虑以下一般程序结构:
关于 C 类实例与 A 类对话的设计模式是什么?
一种选择是 C 类发布 A 类订阅的通知的实例。另一种选择是将对 A 类的引用传递给“链下”(从 A 到 B,然后从 B 到每个 C)。后一种选择允许 C 的实例直接与 A 对话。
如果您的意思是字面上的设计模式(即 GoF 种类),那么这些将是一些相关的选项:
C
项目(直接或间接通过 B),以便当他们想要回话时,A
他们可以简单地调用这个回调——甚至可以有参数B
将其聚合集合的视图直接暴露给A
; A
然后C
直接进行通信A
和C
可能订阅的通知;交流是通过发布事件来完成的另一方面,如果您真的是指架构模式,那么典型的选项是:
A
订阅C
事件。乍一看,这似乎不是一个全面的好主意,除非事件一直非常有用,因为它需要n
对象将指针聚合回回调,在最坏的情况下它们甚至可以只使用一次。A
是另一种选择,但如果您要污染A
方法的公共接口以便C
在非常特定的场景中回调它,则不是一个好的选择。如果已经公开了合适的接口,它可能非常有效A
,但请注意,您可能需要在C
回调之间使用适配器类A
,以便不紧密耦合C
到A
的接口。A
迭代直接提供的集合(视图)并向实例B
提供回调;C
这具有非常松散耦合的优点,并且它将使用最少的内存量,但编码可能有点棘手。