桥模式与装饰模式

时间:2010-02-12 19:28:29

标签: c++ design-patterns decorator bridge

任何人都可以为我详细阐述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 个答案:

答案 0 :(得分:17)

装饰器应匹配您正在装饰的对象的界面。即它具有相同的方法,并允许截取路径中的参数,以及在路上的结果。您可以使用它为装饰对象提供其他行为,同时保持相同的接口/合约。请注意,Decorator的界面可以提供附加功能来创建更有用的对象。

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

答案 1 :(得分:6)

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

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

}

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

<强>装饰:

  1. 在运行时向对象添加行为。继承是实现此功能的关键,这是该模式的优点和缺点。
  2. 它增强了界面的行为
  3. 装饰器可以看作只有一个组件的简并复合。但是,装饰器增加了额外的责任 - 它不是用于对象聚合。
  4. Decorator支持递归合成
  5. Decorator类声明与LCD(最低类别分母)接口的组合关系,并且此数据成员在其构造函数中初始化。
  6. Decorator旨在让您在不​​进行子类化的情况下向对象添加职责
  7. 有关详细信息,请参阅sourcemaking文章。

    来自wikipedia的装饰者的UML图:

    enter image description here

    桥牌模式:

    1. 桥梁是结构模式
    2. 抽象和实现未在编译时绑定
    3. 抽象和实施 - 两者都可以在不影响客户的情况下发生变化
    4. 在以下情况下使用Bridge模式:

      1. 你想要实现的运行时绑定,
      2. 由于耦合接口和众多实现而产生了大量的类,
      3. 您想要在多个对象之间共享实现, 你需要映射正交的类层次结构。
      4. 来自wikipedia的网桥的UML图:

        enter image description here

        从UML图中,您可以发现差异:

        在Decorator模式中,Decorator正在实现Component,它将在运行时由ConcreteComponent替换

        在Bridge模式中,RedefinedAbstraction未实现Implementor。相反,它使用组合,以便在没有客户端知识的情况下,实现者可以在运行时动态变化。

        与Bridge模式不同,Decorator无法将抽象与实现分离。

        几个有用的帖子:

        When to Use the Decorator Pattern?

        When do you use the Bridge Pattern? How is it different from Adapter pattern?