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

