桥接模式也是一个典型的单一职责模式。

在组件设计过程中,如果职责划分不够清晰,当父类发生变更,子类也需要跟着变动,要么违背开闭原则,要么导致子类数量膨胀。桥接模式,就是为了解决这个问题。

桥接模式的做法是,使抽象和实现完全分离,使其能够独立变化。或者也可以直白一点,通过组合/聚合的方式避免继承滥用。

举个🌰:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
abstract class Shape
{
protected Color $color;

public function setColor(Color $color)
{
$this->color = $color;
}

public abstract function draw();
}

class Circle extends Shape
{
public function draw()
{
$this->color->setColor();
echo 'circle', PHP_EOL;
}
}

interface Color{
public function setColor();
}

class Blue implements Color{

public function setColor()
{
echo 'blue', PHP_EOL;
}
}

$shape = new Circle();
$shape->setColor(new Blue());
$shape->draw();

抽象部分使用继承,实现部分使用组合。

后续如果我们需要换成另外一个颜色,只需要稍作改动即可实现:

1
2
3
4
5
6
7
8
9
10
class Red implements Color{
public function setColor()
{
echo 'red', PHP_EOL;
}
}

$shape = new Circle();
$shape->setColor(new Red());
$shape->draw();