詳解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更新mysql后獲取影響的行數(shù)發(fā)生異常解決方法
mysql_affected_rows函數(shù)當(dāng)UPDATE前后的數(shù)據(jù)一樣時會返回異常值,接下來為大家介紹個簡單的解決方法感興趣的朋友可以參考下哈2013-03-03PHP和Selenium搭建高效網(wǎng)絡(luò)爬蟲實現(xiàn)技術(shù)探索
隨著信息時代的到來,網(wǎng)站被認為是獲取信息的主要途徑之一,但是,手動獲取網(wǎng)站上的信息是非常繁瑣的,因此出現(xiàn)了自動抓取網(wǎng)頁的方式——網(wǎng)絡(luò)爬蟲,這篇文章將介紹如何使用PHP和Selenium搭建一個高效的網(wǎng)絡(luò)爬蟲來自動收集信息2024-01-01php實現(xiàn)的簡單數(shù)據(jù)庫操作Model類
這篇文章主要介紹了php實現(xiàn)的簡單數(shù)據(jù)庫操作Model類,結(jié)合實例形式分析了php數(shù)據(jù)庫操作模型類的定義與使用技巧,包括數(shù)據(jù)庫的基本增刪改查等功能,需要的朋友可以參考下2016-11-11ThinkPHP模板標(biāo)簽eq if 中區(qū)分0,null,false的方法
下面小編就為大家?guī)硪黄猅hinkPHP模板標(biāo)簽eq if 中區(qū)分0,null,false的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-03-03