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