亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解PHP設(shè)計(jì)模式之橋接模式

 更新時(shí)間:2022年12月20日 15:01:39   作者:程序員-南  
橋接,顧名思義,就是用來(lái)連接兩個(gè)部分,使得兩個(gè)部分可以互相通訊。橋接模式將系統(tǒng)的抽象部分與實(shí)現(xiàn)部分分離解耦,使他們可以獨(dú)立的變化。本文通過(guò)示例詳細(xì)介紹了橋接模式的原理與使用,需要的可以參考一下

簡(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)文章

最新評(píng)論