橋接模式
把抽象化與實現化解耦,使得二者可以獨立變化。這種類型的設計模式屬于結構型模式,它通過提供抽象化和實現化之間的橋接結構,來實現二者的解耦。將抽象部分與實現部分分離,使它們都可以獨立的變化。在有多種可能會變化的情況下,用繼承會造成類爆炸問題,擴展起來不靈活。實現系統可能有多個角度分類,每一種角度都可能變化。把這種多角度分類分離出來,讓它們獨立變化,減少它們之間耦合。
目錄結構
|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設計模式之外觀模式
下一篇 未完待續......