橋接模式
把抽象化與實現(xiàn)化解耦署穗,使得二者可以獨立變化芯义。這種類型的設計模式屬于結構型模式愕难,它通過提供抽象化和實現(xiàn)化之間的橋接結構早龟,來實現(xiàn)二者的解耦。將抽象部分與實現(xiàn)部分分離猫缭,使它們都可以獨立的變化葱弟。在有多種可能會變化的情況下,用繼承會造成類爆炸問題饵骨,擴展起來不靈活翘悉。實現(xiàn)系統(tǒng)可能有多個角度分類,每一種角度都可能變化居触。把這種多角度分類分離出來妖混,讓它們獨立變化,減少它們之間耦合轮洋。
目錄結構
|facade #項目根目錄
|--Think #核心類庫
|----main
|------road.php #抽象公路角色
|------car.php #抽象汽車接口
|----highSpeedRoad.php #具體公路實現(xiàn)者 高速路
|----nationalRoad.php #具體公路實現(xiàn)者 國道
|----sportsCar.php #具體汽車車實現(xiàn)者 跑車
|----homeCar.php #具體汽車實現(xiàn)者 家轎
|----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();
}
具體公路實現(xiàn)者 高速路 Think/highSpeedRoad.php
<?php
/**
* 具體公路實現(xiàn)者 高速路
*/
namespace Think;
use Think\main\road;
class highSpeedRoad extends road{
public function run() {
$this->_car->run();
echo '開在高速路上'.PHP_EOL;
}
}
具體公路實現(xiàn)者 國道 Think/nationalRoad.php
<?php
/**
* 具體公路實現(xiàn)者 國道
*/
namespace Think;
use Think\main\road;
class nationalRoad extends road{
public function run() {
$this->_car->run();
echo '開在國道上'.PHP_EOL;
}
}
具體汽車車實現(xiàn)者 跑車 Think/sportsCar.php
<?php
/**
* 具體汽車車實現(xiàn)者 跑車
*/
namespace Think;
use Think\main\car;
class sportsCar implements car{
public function run() {
echo "跑車";
}
}
具體汽車實現(xiàn)者 家轎 Think/homeCar.php
<?php
/**
* 具體汽車實現(xiàn)者 家轎
*/
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();
輸出
跑車開在高速路上
家轎開在國道上
優(yōu)點: 1制市、抽象和實現(xiàn)的分離。 2弊予、優(yōu)秀的擴展能力祥楣。 3、實現(xiàn)細節(jié)對客戶透明。
缺點:橋接模式的引入會增加系統(tǒng)的理解與設計難度误褪,由于聚合關聯(lián)關系建立在抽象層责鳍,要求開發(fā)者針對抽象進行設計與編程。
使用場景: 1兽间、如果一個系統(tǒng)需要在構件的抽象化角色和具體化角色之間增加更多的靈活性历葛,避免在兩個層次之間建立靜態(tài)的繼承聯(lián)系,通過橋接模式可以使它們在抽象層建立一個關聯(lián)關系嘀略。 2恤溶、對于那些不希望使用繼承或因為多層次繼承導致系統(tǒng)類的個數(shù)急劇增加的系統(tǒng),橋接模式尤為適用帜羊。 3咒程、一個類存在兩個獨立變化的維度,且這兩個維度都需要進行擴展讼育。
注意事項:對于兩個獨立變化的維度帐姻,使用橋接模式再適合不過了。
上一篇 php設計模式之外觀模式
下一篇 未完待續(xù)......