詳解PHP設(shè)計(jì)模式之橋接模式
簡(jiǎn)介
橋接模式又叫橋梁模式,屬于結(jié)構(gòu)型模式。目的是將抽象與實(shí)現(xiàn)分離,使它們都可以獨(dú)立的變化,解耦。繼承有很多好處,但是會(huì)增加耦合,而橋接模式偏向組合和聚合的方式來(lái)共享。
適用場(chǎng)景
不希望或不適用使用多繼承的場(chǎng)景。
一個(gè)類(lèi)存在2個(gè)或更多的 獨(dú)立變化維度 , 并且這些維度都需要 獨(dú)立擴(kuò)展
優(yōu)點(diǎn)
解耦抽象和具體實(shí)現(xiàn),方便增加抽象和實(shí)現(xiàn)。優(yōu)秀的擴(kuò)充能力
符合開(kāi)閉原則和合成復(fù)用原則。
缺點(diǎn)
增加了系統(tǒng)的理解與設(shè)計(jì)難度。
需要正確地識(shí)別出系統(tǒng)中,兩個(gè)獨(dú)立變化的維度。
擴(kuò)展
為什么要用橋接模式?
先說(shuō)說(shuō)繼承:
如果有一個(gè)手機(jī)類(lèi)作為父類(lèi)A,下面有各個(gè)牌子的手機(jī)作為子類(lèi)B,又有每個(gè)牌子手機(jī)旗下的內(nèi)置應(yīng)用類(lèi)C。此時(shí)如果有3個(gè)手機(jī)的牌子,那么內(nèi)置應(yīng)用的父類(lèi)可能有30個(gè)。
如果因?yàn)樾枨笞冃枰黾邮謾C(jī)品牌B,或者接著有第四層的D類(lèi)繼承第三層的內(nèi)置應(yīng)用類(lèi),想想這個(gè)是多么龐大的數(shù)量。后期難以維護(hù)。如果一旦父級(jí)發(fā)生變動(dòng),株連很多子類(lèi)。
其實(shí)按照合成復(fù)用原則,也就是少用繼承(強(qiáng)耦合),多用組合(弱耦合)或者聚合(中耦合)
以上的問(wèn)題,可以直接拆分成兩個(gè)大模塊:
手機(jī)類(lèi)作為抽象,手機(jī)牌子作為具體的類(lèi)。
內(nèi)置軟件可單獨(dú)抽象,每一個(gè)內(nèi)置的軟件作為具體的類(lè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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
php實(shí)現(xiàn)的mongodb操作類(lèi)實(shí)例
這篇文章主要介紹了php實(shí)現(xiàn)的mongodb操作類(lèi),較為詳細(xì)的分析了php針對(duì)mongodb數(shù)據(jù)庫(kù)操作的各種常用技巧,并將其封裝進(jìn)一個(gè)完整的類(lèi)文件中以便于調(diào)用,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04PHP print類(lèi)函數(shù)使用總結(jié)
PHP print類(lèi)函數(shù)總結(jié),讓你徹底了解print函數(shù)的具體用法與使用范圍。2010-06-06php更新mysql后獲取影響的行數(shù)發(fā)生異常解決方法
mysql_affected_rows函數(shù)當(dāng)UPDATE前后的數(shù)據(jù)一樣時(shí)會(huì)返回異常值,接下來(lái)為大家介紹個(gè)簡(jiǎn)單的解決方法感興趣的朋友可以參考下哈2013-03-03PHP和Selenium搭建高效網(wǎng)絡(luò)爬蟲(chóng)實(shí)現(xiàn)技術(shù)探索
隨著信息時(shí)代的到來(lái),網(wǎng)站被認(rèn)為是獲取信息的主要途徑之一,但是,手動(dòng)獲取網(wǎng)站上的信息是非常繁瑣的,因此出現(xiàn)了自動(dòng)抓取網(wǎng)頁(yè)的方式——網(wǎng)絡(luò)爬蟲(chóng),這篇文章將介紹如何使用PHP和Selenium搭建一個(gè)高效的網(wǎng)絡(luò)爬蟲(chóng)來(lái)自動(dòng)收集信息2024-01-01php實(shí)現(xiàn)的簡(jiǎn)單數(shù)據(jù)庫(kù)操作Model類(lèi)
這篇文章主要介紹了php實(shí)現(xiàn)的簡(jiǎn)單數(shù)據(jù)庫(kù)操作Model類(lèi),結(jié)合實(shí)例形式分析了php數(shù)據(jù)庫(kù)操作模型類(lèi)的定義與使用技巧,包括數(shù)據(jù)庫(kù)的基本增刪改查等功能,需要的朋友可以參考下2016-11-11ThinkPHP模板標(biāo)簽eq if 中區(qū)分0,null,false的方法
下面小編就為大家?guī)?lái)一篇ThinkPHP模板標(biāo)簽eq if 中區(qū)分0,null,false的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03