搜尋
首頁後端開發php教程淺談PHP中的橋接模式

淺談PHP中的橋接模式

Jul 21, 2021 pm 07:53 PM
php橋接模式設計模式

在之前的文章《一起聊聊PHP中的備忘錄模式》中我們介紹了PHP中的備忘錄模式,下面這篇文章帶大家了解一下PHP設計模式中的橋接模式。

淺談PHP中的橋接模式

橋接模式,在程式世界中,其實就是組合/聚合的代名詞。為什麼這麼說呢?熟悉物件導向的我們都知道繼承的好處,子類別可以共享父類別的許多屬性、功能。但是,繼承也會帶來一個問題,那就是嚴重的耦合性。父類別的修改多少都會對子類別產生影響,甚至一個方法或屬性的修改都有可能讓所有子類別都去修改一遍。這樣就違背了開放性封裝原則。而橋接就是為了解決這個問題,它強調的是用組合/聚合的方式來共享一些能用的方法。相信大家一定想到了php中的trait,如果你在工作上使用過這個特性,那麼你就已經用過橋接模式了!

Gof類別圖及解釋

GoF定義:將抽象部分與它的實作部分分離,使它們都可以獨立地變更。

GoF類別圖

淺談PHP中的橋接模式

#程式碼實作

interface Implementor
{
    public function OperationImp();
}

class ConcreteImplementorA implements Implementor
{
    public function OperationImp()
    {
        echo '具体实现A', PHP_EOL;
    }
}

class ConcreteImplementorB implements Implementor
{
    public function OperationImp()
    {
        echo '具体实现B', PHP_EOL;
    }
}

我們先來定義實作介面以及它們具體的實現,也就是真正要執行的功能。就像是適配器模式中的Adaptee。

abstract class Abstraction
{
    protected $imp;
    public function SetImplementor(Implementor $imp)
    {
        $this->imp = $imp;
    }
    abstract public function Operation();
}

class RefinedAbstraction extends Abstraction
{
    public function Operation()
    {
        $this->imp->OperationImp();
    }
}

定義抽象類別的接口,並維護一個對實作的參考。在具體的抽象類別的實作方法中,我們直接呼叫實作介面的真實操作方法。類似於適配器中的Adapter。

$impA = new ConcreteImplementorA();
$impB = new ConcreteImplementorB();

$ra = new RefinedAbstraction();

$ra->SetImplementor($impA);
$ra->Operation();

$ra->SetImplementor($impB);
$ra->Operation();

客戶端調用,我們的抽象類別使用不使用的實作類別就可以讓操作方法變成多態的感覺。

  • 在原始碼解釋中,我們會發現,這個模式和適配器模式非常相似。但是,適配器的目的是為了幫助兩個不太相關的類,讓它們能夠協同工作,實現中間轉換工作。而橋接則是為了讓方法的行為解除繼承耦合,方便地添加、修改,動態呼叫行為,讓抽象介面和實作部分可以獨立進行改變
  • 讓抽象介面和實作部分可以獨立進行改變的意思是,只要維護了實作介面的引用,我們的實作介面的具體實作類別可以是完全不同的類,裡面有不同的功能,並且可以任意改變。讓實現來自己決定它自己是什麼。
  • 橋接模式的優點:分享介面及其實現部分、提高​​可擴充性、實現細節對客戶透明
  • 橋接模式最主要解決的問題就是繼承的不斷增長而帶來的緊密耦合問題
  • 組合與聚合:聚合是弱關係,A可以包含B,但B不是A的一部分;組合是強關係,A包含B,B也是A的一部分,整體與部分的關係

我們的手機有不同的型號,每個型號又要生產大致相同但不同的配件。例如X1手機殼、貼膜、耳機;X2的手機殼、貼膜、耳機等。受限於成本的問題,我們不會給每個型號的手機都去生產完全不一樣的配套配件。而是去盡量使用外部通用的配件(Implementor),讓每一種型號的手機(Abstraction)去進行組合(Bridge),搭配售賣給消費者。這樣,才不至於讓我們的手機品牌太早的消耗完融資關門大吉。看來,做企業和學設計模式還真是有很多相關之處! !

完整程式碼:https://github.com/zhangyue0503/designpatterns-php/blob/master/18.bridge/source/bridge.php

#實例

我們的簡訊傳送也可以用橋接來實現。假設我們有很多的簡訊模板,然後搭配不同的簡訊提供者進行簡訊的發送。這時,我們就可以用橋接模式來形成各種不同的組合。

簡訊發送類別圖

淺談PHP中的橋接模式

#完整原始碼:https://github.com/zhangyue0503/designpatterns-php /blob/master/18.bridge/source/bridge-message.php

<?php

interface MessageTemplate
{
    public function GetTemplate();
}

class LoginMessage implements MessageTemplate
{
    public function GetTemplate()
    {
        echo &#39;您的登录验证码是【AAA】,请不要泄露给他人【XXX公司】!&#39;, PHP_EOL;
    }
}
class RegisterMessage implements MessageTemplate
{
    public function GetTemplate()
    {
        echo &#39;您的注册验证码是【BBB】,请不要泄露给他人【XXX公司】!&#39;, PHP_EOL;
    }
}
class FindPasswordMessage implements MessageTemplate
{
    public function GetTemplate()
    {
        echo &#39;您的找回密码验证码是【CCC】,请不要泄露给他人【XXX公司】!&#39;, PHP_EOL;
    }
}

abstract class MessageService
{
    protected $template;
    public function SetTemplate($template)
    {
        $this->template = $template;
    }
    abstract public function Send();
}

class AliYunService extends MessageService
{
    public function Send()
    {
        echo &#39;阿里云开始发送短信:&#39;;
        $this->template->GetTemplate();
    }
}

class JiGuangService extends MessageService
{
    public function Send()
    {
        echo &#39;极光开始发送短信:&#39;;
        $this->template->GetTemplate();
    }
}

// 三个短信模板
$loginTemplate = new LoginMessage();
$registerTemplate = new RegisterMessage();
$findPwTemplate = new FindPasswordMessage();

// 两个短信服务商
$aliYun = new AliYunService();
$jg = new JiGuangService();

// 随意组合
// 极光发注册短信
$jg->SetTemplate($registerTemplate);
$jg->Send();

// 阿里云发登录短信
$aliYun->SetTemplate($loginTemplate);
$aliYun->Send();

// 阿里云发找回密码短信
$aliYun->SetTemplate($findPwTemplate);
$aliYun->Send();

// 极光发登录短信
$jg->SetTemplate($loginTemplate);
$jg->Send();

// ......

說明

    ##這就是一種聚合模式。模板並不是簡訊發送的一部分,我們不使用模板直接發送也可以,它們沒有強關係
  • 短信發送商的發送方法無需改變,只需要傳入不同的短信模板就可以實現各種模板的快速發送
  • 在不確定是否一定是is-a的關係的情況下,更推薦用橋接模式這種組合/聚合形式的設計方法,如果確定當前的類別關係是is-a,那就不要猶豫的用繼承吧
原文網址:https://juejin.cn/post/6844903986655395848

#作者:硬派專案經理

推薦學習:《PHP影片教學

以上是淺談PHP中的橋接模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:掘金--硬核项目经理。如有侵權,請聯絡admin@php.cn刪除
繼續使用PHP:耐力的原因繼續使用PHP:耐力的原因Apr 19, 2025 am 12:23 AM

PHP仍然流行的原因是其易用性、靈活性和強大的生態系統。 1)易用性和簡單語法使其成為初學者的首選。 2)與web開發緊密結合,處理HTTP請求和數據庫交互出色。 3)龐大的生態系統提供了豐富的工具和庫。 4)活躍的社區和開源性質使其適應新需求和技術趨勢。

PHP和Python:探索他們的相似性和差異PHP和Python:探索他們的相似性和差異Apr 19, 2025 am 12:21 AM

PHP和Python都是高層次的編程語言,廣泛應用於Web開發、數據處理和自動化任務。 1.PHP常用於構建動態網站和內容管理系統,而Python常用於構建Web框架和數據科學。 2.PHP使用echo輸出內容,Python使用print。 3.兩者都支持面向對象編程,但語法和關鍵字不同。 4.PHP支持弱類型轉換,Python則更嚴格。 5.PHP性能優化包括使用OPcache和異步編程,Python則使用cProfile和異步編程。

PHP和Python:解釋了不同的範例PHP和Python:解釋了不同的範例Apr 18, 2025 am 12:26 AM

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

PHP和Python:深入了解他們的歷史PHP和Python:深入了解他們的歷史Apr 18, 2025 am 12:25 AM

PHP起源於1994年,由RasmusLerdorf開發,最初用於跟踪網站訪問者,逐漸演變為服務器端腳本語言,廣泛應用於網頁開發。 Python由GuidovanRossum於1980年代末開發,1991年首次發布,強調代碼可讀性和簡潔性,適用於科學計算、數據分析等領域。

在PHP和Python之間進行選擇:指南在PHP和Python之間進行選擇:指南Apr 18, 2025 am 12:24 AM

PHP適合網頁開發和快速原型開發,Python適用於數據科學和機器學習。 1.PHP用於動態網頁開發,語法簡單,適合快速開發。 2.Python語法簡潔,適用於多領域,庫生態系統強大。

PHP和框架:現代化語言PHP和框架:現代化語言Apr 18, 2025 am 12:14 AM

PHP在現代化進程中仍然重要,因為它支持大量網站和應用,並通過框架適應開發需求。 1.PHP7提升了性能並引入了新功能。 2.現代框架如Laravel、Symfony和CodeIgniter簡化開發,提高代碼質量。 3.性能優化和最佳實踐進一步提升應用效率。

PHP的影響:網絡開發及以後PHP的影響:網絡開發及以後Apr 18, 2025 am 12:10 AM

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip

PHP類型提示如何起作用,包括標量類型,返回類型,聯合類型和無效類型?PHP類型提示如何起作用,包括標量類型,返回類型,聯合類型和無效類型?Apr 17, 2025 am 12:25 AM

PHP類型提示提升代碼質量和可讀性。 1)標量類型提示:自PHP7.0起,允許在函數參數中指定基本數據類型,如int、float等。 2)返回類型提示:確保函數返回值類型的一致性。 3)聯合類型提示:自PHP8.0起,允許在函數參數或返回值中指定多個類型。 4)可空類型提示:允許包含null值,處理可能返回空值的函數。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具