简介
场景
绘制图形时,可以抽象出一个图形类。
然后,增加新的需求,需要给绘制的图形添加颜色,此时系统引入了两个变化维度。有两种方案:
每种图形提供一套颜色的实现(继承关系)
组合图形和颜色(关联关系)
对于第一个方案,类的数量会指数级增长,且类之间的继承导致强耦合。第二种方案更优。
模式定义
桥接模式(Bridge Pattern)将抽象部分与实现部分分离,使它们都可以独立地变化。
模式特点
桥接模式包含四个角色:
- Abstraction:抽象类
- RefinedAbstraction:扩充抽象类
- Implementor:实现类接口
- ConcreteImplementor:具体实现类
优点
- 分离抽象接口及其实现部分,可以独立变化。
- 复用性好,易扩展。
- 符合单一职责原则。
缺点
- 系统复杂度增大,聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
- 使用范围有一定的局限性,需要系统中有两个独立变化的维度。
PHP 代码示例
下面例子中,如果要添加新的形状,只需要添加形状类并继承 Shape 即可。如果要添加新的颜色,只需要添加颜色类并继承 Color 即可。
<?php
abstract class Shape {
private $color;
public function __construct(Color $color) {
$this->color = $color;
}
public abstract function getShape();
public function getColorShape() {
return $this->color->getColor() . ' ' . $this->getShape() . '<br/>';
}
}
class Rect extends Shape {
public function getShape() {
return 'Rect';
}
}
class Circle extends Shape {
public function getShape() {
return 'Circle';
}
}
abstract class Color {
public abstract function getColor();
}
class Red extends Color {
public function getColor() {
return 'Red';
}
}
class Blue extends Color {
public function getColor() {
return 'Blue';
}
}
$rect = new Rect(new Red());
echo $rect->getColorShape();
$circle = new Circle(new Blue());
echo $circle->getColorShape();
输出:
Red Rect
Blue Circle