扩展类:在类中使用或使用观察者?

问题描述:

我需要扩展类(在C++中,但这个问题是语言无关的予想),具有的功能,可以以两种不同的方式实现:扩展类:在类中使用或使用观察者?

  • 通过简单地将逻辑类本身
  • 通过添加观察者逻辑的类,并把该逻辑在一个观察者,在类的外部

有优点和缺点在两个替代方案:

  • 因为代码也可能用于其他类,所以在观察者中添加逻辑似乎更合理。未来的课程只需要支持观察员。另一方面,观察者对计算密集型代码的影响很难预见。代码稍后添加的新观察者可能会对计算密集型代码产生负面影响。

有没有人明确规定在课堂内何时添加新功能,而不是将其放在课堂外的观察者身上?

+0

我不确定这个问题是不是语言不可知的。在C++中使用模板,你可以添加观察者通常没有性能成本,这吹走了你的困境的一条腿:-) – 2010-09-07 10:23:16

+1

顺便说一下,这是假设观察者在编译时解析依赖项,而不是动态添加的对象, “观察”是一个虚拟函数调用的要求。我认为“为类增加逻辑”和“让每个对象都有一个可以在运行时热插拔的逻辑”之间的困境与您所谈论的差异更大,因为它影响了可能行为的范围而不仅仅是表现。所以我认为在你的情况下这是不需要的。道歉,如果是的话。 – 2010-09-07 10:29:45

我认为在这种情况下(就像这么多) - 这取决于。这是一个知道你正在处理的问题背景下什么是合适的案例。

从纯粹的意义上说,您可能认为观察者模型在将来可能更容易扩展和操作。然而,如果真的要在合理的时间范围内工作,纯粹主义观点很少考虑实际的现实。

这很可能是观察者模型为您服务的很好。但逻辑时间是否是关键的,是否可能会很昂贵?如果这些都是您实施过程中重要的事情,那么您必须讲述它们。

不幸的是,只有你可以告诉 - 虽然它可能在一种情况下很好地工作,但概念上相似的情况可能有不同的约束,并且用同样的设计表现不佳(或完全不切实际)。

所以,回答你的问题:不 - 我真的不认为任何人都可以说有明确的规则。

人们可能会有偏好,而且他们会更多或更多地适用。但我怀疑他们会永远具有普遍性。

你将不得不考虑它 - 但这就是它的乐趣!

扩展功能的流行方式是Extension Interface pattern,如POSA1中所述。

您可能会考虑的另一种模式是Proxy pattern。如果逻辑是分立的,则可以将代理对象链接到彼此并通过接口单独引用它们。这应该允许您将逻辑很好地分散在几个独立和可互换的对象上。

由于我对你的情况了解不多,所以对设计给予更多建议是很难的。但我希望这有助于。

+0

虽然我不认为这解决了我的问题,但我在我的应用程序中看到扩展接口模式的其他用途。谢谢。 – Patrick 2010-09-09 07:34:29