桥接模式——组合还是聚合?
我正在阅读一些有关设计模式的书籍,有些将抽象和实现之间的关系描述为组合,有些则将其描述为聚合。现在我想知道:这取决于实施吗?就语言而言?或者上下文?
I'm reading some books about Design Patterns and while some describe the relation between the abstraction and the implementation as a composition, some describe it as an aggregation. Now I wonder: is this dependant on the implementation? On the language? Or context?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
桥接模式的标准 UML 消除了周围的混乱。下面是一个带有简短示例的解释,以澄清这一点。
对于这段冗长的代码,我们深表歉意,最好的方法是将这段代码复制到 Visual Studio 中以便于理解。
仔细阅读代码末尾的解释
——ISpeak是机器人Dog和Cat必须实现的抽象
-- 通过引入由 ISpeak 组成的“Animal”桥来解耦 Dog 和 Cat 类
-- Dog 和 Cat 类扩展了 Animal 类,因此与 ISpeak 解耦。
希望这能澄清
Standard UML of Bridge pattern clears out all air around the confusion. Below is an explanation with a brief example to clear the air around this.
Apologies for this lengthy code, best way is to copy this code to Visual Studio to easily understand it.
Read through the explanation written at the end of code
-- ISpeak is the abstraction that bot Dog and Cat has to implement
-- Decoupled Dog and Cat classes by introducing a bridge "Animal" that is composed of ISpeak
-- Dog and Cat classes extend Animal class and thus are decoupled from ISpeak.
Hope this clarifies
桥接模式必须使用委托(聚合/组合而不是继承)。来自四人帮书籍:
在以下情况下使用桥接模式
the bridge pattern must use delegation (aggregation/composition and not inheritance). from the gang-of-four book:
Use the Bridge pattern when
术语“组合物”和“聚集体”表示或多或少相同的事物并且可以互换使用。在描述容器类(例如列表、动态数组、映射和队列)时,聚合可能会更频繁地使用,其中元素都属于同一类型;然而,这两个术语都可以描述根据其他类定义的类,无论这些类型是同质的(全部相同类型)还是异质的(不同类型的对象)。
为了更清楚地说明这一点:
抽象和实现之间的关系通常意味着继承,而不是组合/聚合;通常,抽象是接口或虚拟基类,实现是实现给定接口的完全具体的类。但是,让事情变得混乱的是,组合/聚合可以是接口的一部分(因为,例如,您可能需要设置/获取用作构建块的对象),并且它们也是一种实现方法(因为您可以使用委托来提供实现中方法的定义)。
为了使这一点更清楚:
既然您已将问题标记为“桥”,我应该指出桥模式的定义是一种使用组合而不是继承来允许多个不同级别的变化的模式。我在大学学到的一个例子......使用继承,您可能会得到类似的结果:
如您所见,这种事情变得非常疯狂,并且您会得到数量可笑的类。同样的事情,使用桥接模式,看起来像:
The terms "composition" and "aggregation" mean more or less the same thing and may be used interchangeably. Aggregation may be used more frequently when describing container classes such as lists, dynamic arrays, maps, and queues where the elements are all of the same type; however, both terms may be found to describe classes defined in terms of other classes, regardless of whether those types are homogenous (all of the same type) or heterogenous (objects of different types).
To make this clearer:
The relationship between abstraction and implementation typically implies inheritance, rather than composition/aggregation; typically the abstraction is an interface or virtual base class, and the implementation is a fully concrete class that implements the given interface. But, to make things confusing, composition/aggregation can be a part of the interface (because, for example, you may need to set/get the objects that are used as building blocks), and they are also an approach to implementation (because you might use delegation to provide the definition for methods in your implementation).
To make this clearer:
Since you have tagged your question "bridge", I should point out that the definition of the bridge pattern is a pattern where you use composition rather than inheritance to allow for variation at multiple different levels. An example that I learned at college... using inheritance you might have something like:
As you can see, this kind of thing goes pretty crazy, and you get a ridiculous number of classes. The same thing, with the bridge pattern, would look like: