橋接模式:在軟件系統(tǒng)中宏多,某些類型由于自身的邏輯儿惫,它具有兩個(gè)或多個(gè)維度的變化,那么如何應(yīng)對(duì)這種“多維度的變化”伸但?這就要使用橋接模式——將抽象部分與它的實(shí)現(xiàn)部分分離肾请,使他們可以獨(dú)立地變化。
UML類圖:
角色介紹:
抽象化(AbstractRoad)角色:抽象化給出的定義更胖,并保存一個(gè)對(duì)實(shí)現(xiàn)化對(duì)象的引用铛铁。
修正抽象化(SpeedWay)角色:擴(kuò)展抽象化角色,改變和修正父類對(duì)抽象化的定義却妨。
實(shí)現(xiàn)化(AbstractCar)角色:這個(gè)角色給出實(shí)現(xiàn)化角色的接口饵逐,但不給出具體的實(shí)現(xiàn)。必須指出的是管呵,這個(gè)接口不一定和抽象化角色的接口定義相同梳毙,實(shí)際上,這兩個(gè)接口可以非常不一樣捐下。
具體實(shí)現(xiàn)化(Bus)角色:這個(gè)角色給出實(shí)現(xiàn)化角色接口的具體實(shí)現(xiàn)账锹。
代碼體現(xiàn):
<?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 ":在高速公路上。";
}
}
/**鄉(xiāng)村街道
* Class Street
*/
class Street extends AbstractRoad
{
function Run()
{
$this->icar->Run();
echo ":在鄉(xiāng)村街道上坷襟。";
}
}
/**抽象汽車接口
* Interface ICar
*/
interface ICar
{
function Run();
}
/**吉普車
* Class Jeep
*/
class Jeep implements ICar
{
function Run()
{
echo "吉普車跑";
}
}
/**小汽車
* Class Car
*/
class Car implements ICar
{
function Run()
{
echo "小汽車跑";
}
}
測(cè)試代碼:
/------------------------橋接模式測(cè)試代碼------------------
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();
適用場(chǎng)景:
1.如果一個(gè)系統(tǒng)需要在構(gòu)件的抽象化角色和具體化角色之間增加更多的靈活性奸柬,避免在兩個(gè)層次之間建立靜態(tài)的聯(lián)系。
2.設(shè)計(jì)要求實(shí)現(xiàn)化角色的任何改變不應(yīng)當(dāng)影響客戶端婴程,或者說實(shí)現(xiàn)化角色的改變對(duì)客戶端是完全透明的廓奕。
3.一個(gè)構(gòu)件有多于一個(gè)的抽象化角色和實(shí)現(xiàn)化角色,系統(tǒng)需要它們之間進(jìn)行動(dòng)態(tài)耦合档叔。
4.雖然在系統(tǒng)中使用繼承是沒有問題的桌粉,但是由于抽象化角色和具體化角色需要獨(dú)立變化,設(shè)計(jì)要求需要獨(dú)立管理這兩者衙四。
參考:《大話設(shè)計(jì)模式》铃肯,作者程杰
https://blog.csdn.net/jhq0113/article/details/45441793