聲明:本系列博客參考資料《大話設計模式》,作者程傑。
橋接模式:在軟件系統中,某些類型由於自身的邏輯,它具有兩個或多個維度的變化,那麼如何應對這種“多維度的變化”?這就要使用橋接模式——將抽象部分與它的實現部分分離,使他們可以獨立地變化。
UML類圖:
角色介紹:
抽象化(AbstractRoad)角色:抽象化給出的定義,並保存一個對實現化對象的引用。
修正抽象化(SpeedWay)角色:擴展抽象化角色,改變和修正父類對抽象化的定義。
實現化(AbstractCar)角色:這個角色給出實現化角色的接口,但不給出具體的實現。必須指出的是,這個接口不一定和抽象化角色的接口定義相同,實際上,這兩個接口可以非常不一樣。
具體實現化(Bus)角色:這個角色給出實現化角色接口的具體實現。
代碼體現:
<?php
/**
* Created by PhpStorm.
* User: Jiang
* Date: 2015/4/26
* Time: 16:39
*/
/**抽象化角色 抽象路
* Class AbstractRoad
*/
abstract class AbstractRoad
{
public $icar;
abstract function Run();
}
/**具體的 高速公路
* Class speedRoad
*/
class SpeedRoad extends AbstractRoad
{
function Run()
{
$this->icar->Run();
echo ":在高速公路上。";
}
}
/**鄉村街道
* Class Street
*/
class Street extends AbstractRoad
{
function Run()
{
$this->icar->Run();
echo ":在鄉村街道上。";
}
}
/**抽象汽車接口
* Interface ICar
*/
interface ICar
{
function Run();
}
/**吉普車
* Class Jeep
*/
class Jeep implements ICar
{
function Run()
{
echo "吉普車跑";
}
}
/**小汽車
* Class Car
*/
class Car implements ICar
{
function Run()
{
echo "小汽車跑";
}
}
測試代碼:
/------------------------橋接模式測試代碼------------------
require_once "./Bridge/Bridge.php";
$speedRoad=new SpeedRoad();
$speedRoad->icar=new Car();
$speedRoad->Run();
echo "<hr/>";
$street=new Street();
$street->icar=new Jeep();
$street->Run();
適用場景:
1.如果一個系統需要在構件的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個層次之間建立靜態的聯繫。
2.設計要求實現化角色的任何改變不應當影響客戶端,或者說實現化角色的改變對客戶端是完全透明的。
3.一個構件有多於一個的抽象化角色和實現化角色,系統需要它們之間進行動態耦合。
4.雖然在系統中使用繼承是沒有問題的,但是由於抽象化角色和具體化角色需要獨立變化,設計要求需要獨立管理這兩者。
歡迎關注我的視頻課程,地址如下,謝謝。