桥梁模式(Bridge)也叫做桥接模式,用于将抽象和实现解耦,使得两者可以独立地变化。桥梁模式完全是为了解决继承的缺点而提出的设计模式。
系统设计时,发现类的继承有 N 层时,可以考虑使用桥梁模式。使用桥梁模式时主要考虑如何拆分抽象和实现,并不是一涉及继承就要考虑使用该模式。
在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。
1 <?php 2 /** 3 * 我们以汽车制造厂生产汽车为例,Vehicle 是抽象生产类,Motorcycle 和 Car 是具体实现子类, 4 * 制造汽车分为生产和组装两部分完成,这意味着我们要在制造方法 manufacture 中实现生产和组装工作, 5 * 这里我们将这一实现过程分离出去成为一个新的接口 Workshop,由该接口的实现类 Produce 和 Assemble 负责具体生产及组装, 6 * 从而实现抽象(Vehicle)与实现(Workshop)的分离,让两者可以独立变化而不相互影响: 7 */ 8 9 abstract class Vehicle 10 { 11 protected $workShop1; 12 protected $workShop2; 13 14 protected function __construct(Workshop $workShop1, Workshop $workShop2) 15 { 16 $this->workShop1 = $workShop1; 17 $this->workShop2 = $workShop2; 18 } 19 20 public function manufacture() 21 { 22 } 23 } 24 25 class Motorcycle extends Vehicle 26 { 27 public function __construct(Workshop $workShop1, Workshop $workShop2) 28 { 29 parent::__construct($workShop1, $workShop2); 30 } 31 32 public function manufacture() 33 { 34 print 'Motorcycle '; 35 $this->workShop1->work(); 36 $this->workShop2->work(); 37 } 38 } 39 40 class Car extends Vehicle 41 { 42 public function __construct(Workshop $workShop1, Workshop $workShop2) 43 { 44 parent::__construct($workShop1, $workShop2); 45 } 46 47 public function manufacture() 48 { 49 print 'Car '; 50 $this->workShop1->work(); 51 $this->workShop2->work(); 52 } 53 } 54 55 56 57 58 interface Workshop 59 { 60 public function work(); 61 } 62 63 class Produce implements Workshop 64 { 65 public function work() 66 { 67 print 'Produced '; 68 } 69 } 70 71 class Assemble implements Workshop 72 { 73 public function work() 74 { 75 print 'Assembled'; 76 } 77 }