桥接模式也是一个典型的单一职责模式。
在组件设计过程中,如果职责划分不够清晰,当父类发生变更,子类也需要跟着变动,要么违背开闭原则,要么导致子类数量膨胀。桥接模式,就是为了解决这个问题。
桥接模式的做法是,使抽象和实现完全分离,使其能够独立变化。或者也可以直白一点,通过组合/聚合的方式避免继承滥用。
举个🌰:
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();
|