溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

php設(shè)計(jì)模式中橋接模式有哪些學(xué)習(xí)心得

發(fā)布時(shí)間:2020-08-05 09:44:49 來(lái)源:億速云 閱讀:161 作者:Leah 欄目:編程語(yǔ)言

php設(shè)計(jì)模式中橋接模式有哪些學(xué)習(xí)心得?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。

 假如你有一個(gè)形狀類(lèi)(Shape),目前它擴(kuò)展出了兩個(gè)子類(lèi),圓形類(lèi)和正方形類(lèi)。偽代碼如下:

interface Shape
{
    function fill ();
}

class circleShage implements Shape
{
    public function fill ()
    {
        echo '圓形' . PHP_EOL;
    }
}

class SquareShape implements Shape
{
    public function fill ()
    {
        echo '正方形' . PHP_EOL;
    }
}

現(xiàn)在你想給形狀增加顏色——紅色、藍(lán)色。那么,你應(yīng)該如何做,如果用繼承的思想,那么就需要寫(xiě)出四個(gè)類(lèi),分別如下:

class RedCircleShage implements Shape
{
    public function fill ()
    {
        echo '紅色圓形' . PHP_EOL;
    }
}

class RedSquareShape implements Shape
{
    public function fill ()
    {
        echo '紅色正方形' . PHP_EOL;
    }
}

class BlueCircleShage implements Shape
{
    public function fill ()
    {
        echo '藍(lán)色圓形' . PHP_EOL;
    }
}

class BlueSquareShape implements Shape
{
    public function fill ()
    {
        echo '藍(lán)色正方形' . PHP_EOL;
    }
}

但現(xiàn)在如果我想加入新的形狀——三角形,新的顏色——黑色以及白色。那么我們就需要12個(gè)子類(lèi)(類(lèi)爆炸),那么有沒(méi)有什么好的辦法來(lái)解決呢?

合成(組合)與聚合

解決上述問(wèn)題前,我們想理解合成與聚合的含義。

合成聚合原則:盡量使用合成/聚合,盡量不要使用繼承。

合成(組合):表示一種整體與部分的關(guān)系(強(qiáng)關(guān)系),它們具有相同的生命周期,比如人和心臟的關(guān)系,心臟是人的一部分。

聚合:表示一種整體與部分的關(guān)系(弱關(guān)系),表示A對(duì)象可以包含B對(duì)象,但B對(duì)象并不是A對(duì)象的一部分。比如,我們上面所說(shuō)的形狀和顏色,形狀可以包含顏色,但顏色并不是形狀的一部分。

橋接模式,就是使用聚合來(lái)對(duì)系統(tǒng)進(jìn)行解耦的。

橋接模式

定義:將抽象部分與它的實(shí)現(xiàn)分離,使他們可以獨(dú)立的變化

上面的定義很難理解,用我們上面的例子就是,一個(gè)系統(tǒng)可能有多個(gè)角度分類(lèi)(顏色、形狀),每一種分類(lèi)都可能有變化(新增新的形狀和顏色),那么我們就可以用多個(gè)角度將系統(tǒng)的實(shí)現(xiàn)分離出來(lái),降低他們之間的耦合。

那么如何來(lái)實(shí)現(xiàn)呢?下面是實(shí)現(xiàn)代碼:

abstract class FShape
{
    protected $color = null;
    public function __construct(IColor $color)
    {
        $this->color = $color;
    }
    public function shape ()
    {
        echo $this->color->color() . $this->setShape() . PHP_EOL;
    }
    protected abstract function setShape ();
}

class CircleShape extends FShape
{
    protected function setShape ()
    {
        return '圓形';
    }
}

class SquareShape extends FShape
{
    protected function setShape ()
    {
        return '正方形';
    }
}

interface IColor
{
    public function color ();
}

class BlueColor implements IColor
{
    public function color ()
    {
        return '藍(lán)色';
    }
}

class RedColor implements IColor
{
    public function color ()
    {
        return '紅色';
    }
}

測(cè)試代碼如下:

$blueColor = new BlueColor();
$redColor = new RedColor();

$blueCircleShape = new CircleShape($blueColor);
$redCircleShape = new CircleShape($redColor);
$blueSquareShape = new SquareShape($blueColor);
$redSquareShape = new SquareShape($redColor);

$blueCircleShape->shape();
$redCircleShape->shape();
$blueSquareShape->shape();
$redSquareShape->shape();

使用橋接模式后,我們的代碼就符合了“開(kāi)閉原則”, 當(dāng)有新的形狀或顏色加入時(shí),我們只需要添加新的類(lèi)即可。而不用去修改之前的類(lèi)。


看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI