詳解PHP設(shè)計模式之橋接模式
簡介
橋接模式又叫橋梁模式,屬于結(jié)構(gòu)型模式。目的是將抽象與實現(xiàn)分離,使它們都可以獨立的變化,解耦。繼承有很多好處,但是會增加耦合,而橋接模式偏向組合和聚合的方式來共享。
適用場景
不希望或不適用使用多繼承的場景。
一個類存在2個或更多的 獨立變化維度 , 并且這些維度都需要 獨立擴展
優(yōu)點
解耦抽象和具體實現(xiàn),方便增加抽象和實現(xiàn)。優(yōu)秀的擴充能力
符合開閉原則和合成復(fù)用原則。
缺點
增加了系統(tǒng)的理解與設(shè)計難度。
需要正確地識別出系統(tǒng)中,兩個獨立變化的維度。
擴展
為什么要用橋接模式?
先說說繼承:
如果有一個手機類作為父類A,下面有各個牌子的手機作為子類B,又有每個牌子手機旗下的內(nèi)置應(yīng)用類C。此時如果有3個手機的牌子,那么內(nèi)置應(yīng)用的父類可能有30個。
如果因為需求變需要增加手機品牌B,或者接著有第四層的D類繼承第三層的內(nèi)置應(yīng)用類,想想這個是多么龐大的數(shù)量。后期難以維護。如果一旦父級發(fā)生變動,株連很多子類。
其實按照合成復(fù)用原則,也就是少用繼承(強耦合),多用組合(弱耦合)或者聚合(中耦合)
以上的問題,可以直接拆分成兩個大模塊:
手機類作為抽象,手機牌子作為具體的類。
內(nèi)置軟件可單獨抽象,每一個內(nèi)置的軟件作為具體的類。
然后讓讓兩個抽象進行牽線搭橋,這邊是橋接模式的思路。
案例代碼
abstract class Mobile {
abstract public function operate();
}
class HuaWei extends Mobile {
public function operate() {
echo '華為手機';
}
}
class Vivo extends Mobile {
public function operate() {
echo 'Vivo手機';
}
}
Abstract class Abstraction {
protected $implementer;
public function setImplementer ($implementer) {
$this->implementer = $implementer;
}
public function run() {
$this->implementer->operate();
}
}
class HuaWeiApp extends Abstraction {
public function run() {
$this->implementer->operate();
}
}
class VivoApp extends Abstraction {
public function run() {
$this->implementer->operate();
}
}
//調(diào)用端
$ab = new HuaWeiApp();
$ab->setImplementer(new HuaWei);
$ab->run();
$ab = new VivoApp();
$ab->setImplementer(new Vivo);
$ab->run();抽象代碼
//創(chuàng)建一個實現(xiàn)
abstract class Implementer {
abstract public function operate();
}
class ImplementerA extends Implementer {
public function operate() {
echo 'ImplementerA';
}
}
class ImplementerB extends Implementer {
public function operate() {
echo 'ImplementerB';
}
}
Abstract class Abstraction {
protected $implementer;
//用組合的方式替代繼承
public function setImplementer (Implementer $implementer) {
$this->implementer = $implementer;
}
public function run() {
$this->implementer->operate();
}
}
class RefinedAbstraction extends Abstraction {
public function run() {
$this->implementer->operate();
}
}
//調(diào)用端============================================================
$ab = new RefinedAbstraction();
$ab->setImplementer(new ImplementerA());
$ab->run();
$ab->setImplementer(new ImplementerB());
$ab->run();到此這篇關(guān)于詳解PHP設(shè)計模式之橋接模式的文章就介紹到這了,更多相關(guān)PHP橋接模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
php在多維數(shù)組中根據(jù)鍵名快速查詢其父鍵以及父鍵值的代碼
有一個多維數(shù)組,有多少維大家可以自定義。假如我們要在這個數(shù)組中找一個鍵為'subIndex'的值,我們可以用for、foreach等方法遍歷查找 反過來,假如我們?nèi)我饨o出一個或多個鍵,要求找出這個鍵的父級數(shù)組的鍵和值。這又如何實現(xiàn)?2011-05-05
php+mysql+jquery實現(xiàn)簡易的檢索自動補全提示功能
這篇文章主要介紹了php+mysql+jquery實現(xiàn)簡易的檢索自動補全提示功能,涉及基于jQuery的ajax數(shù)據(jù)庫查詢與事件動態(tài)響應(yīng)相關(guān)操作技巧,需要的朋友可以參考下2017-04-04
php自定義函數(shù)實現(xiàn)JS的escape的方法示例
這篇文章主要介紹了php自定義函數(shù)實現(xiàn)JS的escape的方法,結(jié)合完整實例形式分析了php實現(xiàn)JS的escape功能函數(shù)的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2016-07-07

