这个博客写的很好,定义和例子都说的很形像,直接引用。
https://blog.csdn.net/xingjiarong/article/details/50132727
例子:大中小3种型号的画笔,能够绘制5种不同颜色,如果使用蜡笔,我们需要准备3*5=15支蜡笔,也就是说必须准备15个具体的蜡笔类。而如果使用毛笔的话,只需要3种型号的毛笔,外加5个颜料盒,用3+5=8个类就可以实现15支蜡笔的功能。实际上,蜡笔和毛笔的关键一个区别就在于笔和颜色是否能够分离。
定义:桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。
如果抽象和实现两者做不到独立地变化,就不算桥接模式
http://www.runoob.com/design-pattern/bridge-pattern.html
优点: 1、抽象和实现的分离。 2、优秀的扩展能力。 3、实现细节对客户透明。
缺点:桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
使用场景:
1、如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
2、对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
3、一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
注意事项:对于两个独立变化的维度,使用桥接模式再适合不过了。
桥接属于聚合关系,两者关联 但不继承
适配器属于组合关系,适配者需要继承源
聚合关系:A对象可以包含B对象 但B对象不是A对象的一部分。例如,狼群和狼。
桥梁模式的结构
示例
abstract class brushPen{
public $color;
public function setColor(implementorColor $color){
$this->color = $color;
}
abstract public function draw();
}
abstract class implementorColor{
abstract public function bepaint();
}
class bigPen extends brushPen{
public function draw(){
echo $this->color->bepaint() . " big\n";
}
}
class smallPen extends brushPen{
public function draw(){
echo $this->color->bepaint() . " small\n";
}
}
class middlePen extends brushPen{
public function draw(){
echo $this->color->bepaint() . " middle\n";
}
}
class blue extends implementorColor{
public function bepaint(){
echo 'blue';
}
}
class red extends implementorColor{
public function bepaint(){
echo 'red';
}
}
class green extends implementorColor{
public function bepaint(){
echo 'green';
}
}
$color = new blue();
$pen = new smallPen();
$pen->setColor($color);
$pen->draw();