任何人都可以为我详细阐述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;
}
答案 0 :(得分:17)
装饰器应匹配您正在装饰的对象的界面。即它具有相同的方法,并允许截取路径中的参数,以及在路上的结果。您可以使用它为装饰对象提供其他行为,同时保持相同的接口/合约。请注意,Decorator的界面可以提供附加功能来创建更有用的对象。
Bridge没有这样的限制。面向客户端的接口可以与提供实现的底层组件不同,因此它在客户端的接口和实际实现之间桥接(可能不是客户端友好的,可能会有变化等。 )
答案 1 :(得分:6)
你的装饰模式实现不太正确 - 如果你这样做会更有意义:
class PersonWearingShirt : IPerson
{
private:
IPerson * m_p; //put a shirt on the person;
}
这个想法是,当你装饰一个类时,你暴露出完全相同的接口。这使您的“装饰”实例看起来像原始实体一样。这允许您使用多个装饰器多次包装实例,但处理它与处理原始实例完全相同。
答案 2 :(得分:1)
布赖恩是对的。我将在概念上添加,客户端将“知道”它使用桥接到底层对象,但是使用装饰器,客户端将无法知道它与目标对象之间存在装饰层。
桥梁的目的是创建一个抽象层来保护客户端。装饰器的目的是在没有客户端知道的情况下向对象添加功能。大多数装饰器会将所有函数调用直接传递给指向其父类的指针,除了直接与装饰器设计要更改的函数相关的函数。
答案 3 :(得分:1)
<强>装饰:强>
有关详细信息,请参阅sourcemaking文章。
来自wikipedia的装饰者的UML图:
桥牌模式:
在以下情况下使用Bridge模式:
来自wikipedia的网桥的UML图:
从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?