我正在学习软件设计模式,想知道桥和装饰模式之间的区别
interface Iconcept
{
void action();
}
class concept : Iconcept
{
public void action()
{
Console.WriteLine("walking ");
}
}
class decoratorA : Iconcept
{
Iconcept concept;
public decoratorA(Iconcept concept)
{
this.concept = concept;
}
public void action()
{
concept.action();
Console.WriteLine("with his dog");
}
}
class decoratorB : Iconcept
{
Iconcept concept;
public decoratorB(Iconcept concept)
{
this.concept = concept;
}
public void action()
{
concept.action();
Console.WriteLine("in the rain");
}
}
class client
{
static void Main()
{
Iconcept concept = new concept();
concept.action();
new decoratorA(concept).action();
new decoratorB(concept).action();
Console.ReadLine();
}
}
装饰者模式
定义:动态地将附加职责附加到对象。装饰器为子类化提供了灵活的替代方法,以扩展功能。
现在我们把这个代码用于装饰器模式,我有一个名称概念的实现,我正在使用新的实现类名作为decoratorA和decoratorB来扩展/装饰实现
桥梁模式
定义:将抽象与其实现分离,以使两者可以独立变化。
我有一个名为 concept 的旧实现,并且在旧实现中没有做任何更改我正在实现一个新的实现。
所以区分两种模式
答案 0 :(得分:2)
Bridge 通过包装使用不一定共享对象的同一接口的类实现的对象,将抽象与实现分离。
装饰器通过包装使用继承与实现的对象相同的接口的类实现的对象来修改现有行为,因此它必然具有相同的行为。
答案 1 :(得分:1)
Bridge将具有两个不同的类型层次结构。一个用于超类抽象,另一个用于实现。超类抽象对实现有参考。
另一方面,装饰器结构的顶部将具有一个常见的类型。装饰对象和装饰器对象将共享相同的超级类型。装饰器将具有对装饰对象的引用。
在两种情况下,客户端都会将实际对象(Bridge的实现对象和要装饰的对象)传递给Bridge和装饰器对象。
答案 2 :(得分:0)
你应该阅读这些页面Bridge和Decorator,有很多关于设计模式的内容,我不喜欢他们的一些代码示例,但很好地解释了意图,问题和结构。
两种模式都试图简化复杂的继承类结构,因此它们在意图上看起来相似,但它们试图解决的问题和它们的做法是不同的。
Decorator
尝试从对象中抽象出一些可选行为,因此您不必多次扩展核心类,典型的示例是UI组件。您可以使用TextView,带边框的TextView,带边框和阴影的TextView等。在该帖子中有一个与Windows类似的示例。因此,解决方案是使抽象Decorator
从核心元素的相同接口扩展,并且它将具有对核心元素的引用。创建textview的代码可能是这样的:
UIElement textview = new BorderTextView(new ShadowTextView(new TextView()));
Bridge
尝试将抽象与其实现分离,并使两者在需要时不同。
Bridge是“句柄/正文”习语的同义词。这是一种将实现类封装在接口类中的设计机制。前者是身体,后者是手柄。用户将句柄视为实际类,但工作在正文中完成。 “句柄/体类成语可用于将复杂的抽象分解为更小,更易管理的类。这个成语可能反映了控制对它的访问的多个类共享单个资源(例如引用计数)。”
在这种情况下,“句柄”引用了“body”,但是“body”不知道他的“句柄”,而不像Decorator
,其中行为的抽象具有对父母的引用抽象,但具体实现(我们在示例中的textview核心)不知道装饰器。
答案 3 :(得分:0)
Decorator和Bridge模式都使用Composition。 恕我直言,区别在于客户端代码使用这些模式的方式。
Bridge模式将实现注入到抽象中。 然后,它从抽象调用方法。
$implementation = new MyImplementationA;
$abstraction = new AbstractionParent($implementation);
$abstraction->doSomething();
$implementation = new MyImplementationB;
$abstraction = new AbstractionChild($implementation);
$abstraction->doSomething();
Decorator模式将对象堆叠如下:
$helloWorldBase = new HelloWorldBase();
$helloWorldDecoEN = new HelloWorlDecoratorEN($helloWorldBase);
$helloWorldDecoNL = new HelloWorlDecoratorNL($helloWorldDecoEN);
$helloWorldDecoPL = new HelloWorlDecoratorPL($helloWorldDecoNL);
$decorator = new HelloWorldBaseDecorator($helloWorldDecoPL);
echo $decorator->sayHello();