桥接模式
把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。将抽象部分与实现部分分离,使它们都可以独立的变化。在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。实现系统可能有多个角度分类,每一种角度都可能变化。把这种多角度分类分离出来,让它们独立变化,减少它们之间耦合。
目录结构
|facade #项目根目录
|--Think #核心类库
|----main
|------road.php #抽象公路角色
|------car.php #抽象汽车接口
|----highSpeedRoad.php #具体公路实现者 高速路
|----nationalRoad.php #具体公路实现者 国道
|----sportsCar.php #具体汽车车实现者 跑车
|----homeCar.php #具体汽车实现者 家轿
|----Loder.php #自动加载类
|--index.php #单一的入口文件
代码实践
抽象公路角色 Think/main/road.php
<?php
/**
* 抽象公路角色
*/
namespace Think\main;
abstract class road{
protected $_car;
abstract function run();
public function __construct(car $car) {
$this->_car = $car;
}
}
抽象汽车接口 Think/main/car.php
<?php
/**
* 抽象汽车接口
*/
namespace Think\main;
interface car{
function run();
}
具体公路实现者 高速路 Think/highSpeedRoad.php
<?php
/**
* 具体公路实现者 高速路
*/
namespace Think;
use Think\main\road;
class highSpeedRoad extends road{
public function run() {
$this->_car->run();
echo '开在高速路上'.PHP_EOL;
}
}
具体公路实现者 国道 Think/nationalRoad.php
<?php
/**
* 具体公路实现者 国道
*/
namespace Think;
use Think\main\road;
class nationalRoad extends road{
public function run() {
$this->_car->run();
echo '开在国道上'.PHP_EOL;
}
}
具体汽车车实现者 跑车 Think/sportsCar.php
<?php
/**
* 具体汽车车实现者 跑车
*/
namespace Think;
use Think\main\car;
class sportsCar implements car{
public function run() {
echo "跑车";
}
}
具体汽车实现者 家轿 Think/homeCar.php
<?php
/**
* 具体汽车实现者 家轿
*/
namespace Think;
use Think\main\car;
class homeCar implements car{
public function run() {
echo '家轿';
}
}
自动加载类 Think/Loder.php
<?php
namespace Think;
class Loder{
static function autoload($class){
require BASEDIR . '/' .str_replace('\\','/',$class) . '.php';
}
}
入口文件index.php
<?php
define('BASEDIR',__DIR__);
include BASEDIR . '/Think/Loder.php';
spl_autoload_register('\\Think\\Loder::autoload');
//让跑车开在高速公路上
$highSpeedRoad = new \Think\highSpeedRoad(new \Think\sportsCar());
$highSpeedRoad->run();
//让家轿开在国道上
$nationalRoad = new \Think\nationalRoad(new \Think\homeCar());
$nationalRoad->run();
输出
跑车开在高速路上
家轿开在国道上
优点: 1、抽象和实现的分离。 2、优秀的扩展能力。 3、实现细节对客户透明。
缺点:桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
使用场景: 1、如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。 2、对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。 3、一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
注意事项:对于两个独立变化的维度,使用桥接模式再适合不过了。
上一篇 php设计模式之外观模式
下一篇 未完待续......
网友评论