官方解释:桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。
我的理解:将原来有关联的类全都单独剥离出来,比如A继承B,B继承C,单独封装为A、B、C,解除三者的继承关系,实现解耦,以免继承太多,给代码维护造成较高的成本。
使用场景人开着车在桥上跑,人可以是男人、女人,车可以是公交车、汽车、三轮车,桥可以是铁桥、木桥、石桥。传统模式的写法就是人继承车,车继承桥,但是由于这三个维度都有多种变化,如果用继承来写,势必会造成类的爆炸。
传统模式与桥接模式示意图 优点两种模式的差别显而易见,左边这种会虽然维度的增加或者每个维度变化的增加而已指数倍增长,,而桥接模式实现了解耦,使其互不关联,互不影响,这用成语来说叫做分而治之,每个类只做一件事情,符合设计原则的单一原则,维度的增加与变化的增加不会影响之前的类,符合开闭原则
代码实例目录结构:
Bridge.php 抽象桥和实现桥类
setBridge();
echo "".$this->people->setPeople() . $this->car->setCar() . $this->bridge."";
}
}
class TieBridge extends Bridge
{
public function setBridge()
{
// TODO: Implement setBridge() method.
$this->bridge = '在铁桥上跑';
}
}
class MuBridge extends Bridge
{
public function setBridge()
{
// TODO: Implement setBridge() method.
$this->bridge = '在木桥上跑';
}
}
class ShiBridge extends Bridge
{
public function setBridge()
{
// TODO: Implement setBridge() method.
$this->bridge = '在石桥上跑';
}
}
Car.php 抽象车和实现车类:
People.php 抽象人和实现人类:
Client.php 调用
car = new Bus(); $bridge->people = new Women(); $bridge->run(); echo "分割线-------------------------------------------------------------------"; $bridge = new TieBridge(); $bridge->car = new Qiche(); $bridge->people = new Man(); $bridge->run(); echo "分割线-------------------------------------------------------------------"; $bridge = new ShiBridge(); $bridge->car = new Sanlun(); $bridge->people = new Women(); $bridge->run();运行结果



