12

任何人都可以为我详细说明 Bridge 设计模式和 Decorator 模式。我发现它在某些方面很相似。不知道怎么区分?

我的理解是,在Bridge中,它将实现与接口分开,通常您只能应用一种实现。装饰器是一种包装器,你可以尽可能多地包装。

例如,

桥梁模式

class Cellphone {
private:
Impl* m_OS;         // a cellphone can have different OS

}

装饰图案

class Shirt {
private:
Person * m_p;           //put a shirt on the person;

}
4

4 回答 4

20

装饰器应该与你正在装饰的对象的接口相匹配。即,它具有相同的方法,并允许在输入时截取参数,并在输出时截取结果。您可以使用它为装饰对象提供额外的行为,同时保持相同的接口/合同。请注意,装饰器的接口可以提供额外的功能来创建更有用的对象。

桥没有这样的限制。面向客户端的接口可以不同于提供实现的底层组件,因此它是客户端接口和实际实现之间的桥梁(可能对客户端不友好,可能会发生变化等)

于 2010-02-12T19:31:31.387 回答
6

您的装饰器模式实现不太正确 - 如果您这样做会更有意义:

class PersonWearingShirt : IPerson
{
private:
    IPerson * m_p;           //put a shirt on the person;

}

这个想法是,当你装饰一个类时,你暴露了完全相同的接口。这使您的“装饰”实例看起来和行为与原始实例一样。这允许您使用多个装饰器多次包装一个实例,但对待它与对待原始实例完全相同。

于 2010-02-12T19:35:32.523 回答
5

装饰师:

  1. 在运行时向对象添加行为。继承是实现这一功能的关键,这既是这种模式的优点也是缺点。
  2. 它增强了界面的行为
  3. Decorator 可以被视为只有一个组件的退化组合。然而,装饰者增加了额外的责任——它不是为对象聚合而设计的。
  4. 装饰器支持递归组合
  5. Decorator 类声明了与 LCD(最低类分母)接口的组合关系,该数据成员在其构造函数中初始化。
  6. 装饰器旨在让您在没有子类化的情况下向对象添加职责

有关更多详细信息,请参阅来源制作文章。

来自维基百科的装饰器 UML 图:

在此处输入图像描述

桥梁模式:

  1. 桥梁是结构模式
  2. 抽象和实现在编译时不受约束
  3. 抽象和实现——两者都可以变化而不会对客户端产生影响

在以下情况下使用桥接模式:

  1. 你想要实现的运行时绑定,
  2. 由于耦合接口和众多实现,您会产生大量的类,
  3. 你想在多个对象之间共享一个实现,你需要映射正交的类层次结构。

来自维基百科的 Bridge 的 UML 图:

在此处输入图像描述

从UML图中,您可以观察到差异:

在 Decorator 模式中,Decorator 实现的是 Component,在运行时会被 ConcreteComponent 取代

在桥接模式中,RedefinedAbstraction 没有实现 Implementor。相反,它使用组合,以便实现者可以在运行时动态变化,而无需客户知道。

与桥模式不同,装饰器不能将抽象与实现分离。

一些更有用的帖子:

何时使用装饰器模式?

什么时候使用桥接模式?它与适配器模式有何不同?

于 2016-05-30T07:34:55.013 回答
1

布赖恩是正确的。我将在概念上补充一点,客户端将“知道”它正在使用到底层对象的桥接,但是使用装饰器,客户端将无法知道它和目标对象之间存在装饰器层。

网桥的目的是创建一个抽象层来保护客户端。装饰器的目的是在客户不知道的情况下向对象添加功能。大多数装饰器会将所有函数调用直接传递给指向其父类的指针,但与装饰器旨在更改的内容直接相关的函数除外。

于 2010-02-12T19:40:57.083 回答