乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

       硬核項(xiàng)目經(jīng)理 2021-05-31

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

      橋接模式,在程序世界中,其實(shí)就是組合/聚合的代名詞。為什么這么說(shuō)呢?熟悉面向?qū)ο蟮奈覀兌贾览^承的好處,子類可以共享父類的很多屬性、功能。但是,繼承也會(huì)帶來(lái)一個(gè)問題,那就是嚴(yán)重的耦合性。父類的修改多少都會(huì)對(duì)子類產(chǎn)生影響,甚至一個(gè)方法或?qū)傩缘男薷亩加锌赡茏屗凶宇惗既バ薷囊槐?。這樣就違背了開放封裝原則。而橋接就是為了解決這個(gè)問題,它強(qiáng)調(diào)的是用組合/聚合的方式來(lái)共享一些能用的方法。相信大家一定想到了php中的trait,如果你在工作中使用過(guò)這個(gè)特性,那么你就已經(jīng)用過(guò)橋接模式了!

      Gof類圖及解釋


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

      GoF類圖

      代碼實(shí)現(xiàn)

      interface Implementor
      {
      public function OperationImp();
      }

      class ConcreteImplementorA implements Implementor
      {
      public function OperationImp()
      {
      echo '具體實(shí)現(xiàn)A', PHP_EOL;
      }
      }

      class ConcreteImplementorB implements Implementor
      {
      public function OperationImp()
      {
      echo '具體實(shí)現(xiàn)B', PHP_EOL;
      }
      }

      我們先來(lái)定義實(shí)現(xiàn)接口以及它們具體的實(shí)現(xiàn),也就是真正要執(zhí)行的功能。就像是適配器模式中的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();
      }
      }

      定義抽象類的接口,并維護(hù)一個(gè)對(duì)實(shí)現(xiàn)的引用。具體的抽象類的實(shí)現(xiàn)方法中,我們直接調(diào)用實(shí)現(xiàn)接口的真實(shí)操作方法。類似于適配器中的Adapter。

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

      $ra = new RefinedAbstraction();

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

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

      客戶端調(diào)用,我們的抽象類使用不用的實(shí)現(xiàn)類就可以讓操作方法變成多態(tài)的感覺。

      • 在源碼解釋中,我們會(huì)發(fā)現(xiàn),這個(gè)模式和適配器模式非常相似。但是,適配器的目的是為了幫助兩個(gè)不太相關(guān)的類,讓它們能夠協(xié)同工作,實(shí)現(xiàn)中間轉(zhuǎn)換工作。而橋接則是為了讓方法的行為解除繼承耦合,方便地添加、修改,動(dòng)態(tài)調(diào)用行為,讓抽象接口和實(shí)現(xiàn)部分可以獨(dú)立進(jìn)行改變

      • 讓抽象接口和實(shí)現(xiàn)部分可以獨(dú)立進(jìn)行改變的意思是,只要維護(hù)了實(shí)現(xiàn)接口的引用,我們的實(shí)現(xiàn)接口的具體實(shí)現(xiàn)類可以是完全不同的類,里面有不同的功能,并且可以任意改變。讓實(shí)現(xiàn)來(lái)自己決定它自己是什么。

      • 橋接模式的優(yōu)點(diǎn):分享接口及其實(shí)現(xiàn)部分、提高可擴(kuò)充性、實(shí)現(xiàn)細(xì)節(jié)對(duì)客戶透明

      • 橋接模式最主要解決的問題就是繼承的不斷增長(zhǎng)而帶來(lái)的緊耦合問題

      • 組合與聚合:聚合是弱關(guān)系,A可以包含B,但B不是A的一部分;組合是強(qiáng)關(guān)系,A包含B,B也是A的一部分,整體和部分的關(guān)系

      我們的手機(jī)有不同的型號(hào),每個(gè)型號(hào)又要生產(chǎn)大致相同但不同的配件。比如X1手機(jī)殼、貼膜、耳機(jī);X2的手機(jī)殼、貼膜、耳機(jī)等。受限于成本的問題,我們不會(huì)給每一個(gè)型號(hào)的手機(jī)都去生產(chǎn)完全不一樣的配套配件。而是去盡量使用外部通用的配件(Implementor),讓每一種型號(hào)的手機(jī)(Abstraction)去進(jìn)行組合(Bridge),搭配售賣給消費(fèi)者。這樣,才不至于讓我們的手機(jī)品牌太早的消耗完融資關(guān)門大吉??磥?lái),做企業(yè)和學(xué)設(shè)計(jì)模式還真是有很多相關(guān)之處哦??!

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

      實(shí)例

      我們的短信發(fā)送也可以用橋接來(lái)實(shí)現(xiàn)。假設(shè)我們有很多的短信模板,然后搭配不同的短信提供商進(jìn)行短信的發(fā)送。這時(shí),我們就可以用橋接模式來(lái)形成各種不同的組合。

      短信發(fā)送類圖

      完整源碼: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 '您的登錄驗(yàn)證碼是【AAA】,請(qǐng)不要泄露給他人【XXX公司】!', PHP_EOL;
      }
      }
      class RegisterMessage implements MessageTemplate
      {
      public function GetTemplate()
      {
      echo '您的注冊(cè)驗(yàn)證碼是【BBB】,請(qǐng)不要泄露給他人【XXX公司】!', PHP_EOL;
      }
      }
      class FindPasswordMessage implements MessageTemplate
      {
      public function GetTemplate()
      {
      echo '您的找回密碼驗(yàn)證碼是【CCC】,請(qǐng)不要泄露給他人【XXX公司】!', 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 '阿里云開始發(fā)送短信:';
      $this->template->GetTemplate();
      }
      }

      class JiGuangService extends MessageService
      {
      public function Send()
      {
      echo '極光開始發(fā)送短信:';
      $this->template->GetTemplate();
      }
      }

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

      // 兩個(gè)短信服務(wù)商
      $aliYun = new AliYunService();
      $jg = new JiGuangService();

      // 隨意組合
      // 極光發(fā)注冊(cè)短信
      $jg->SetTemplate($registerTemplate);
      $jg->Send();

      // 阿里云發(fā)登錄短信
      $aliYun->SetTemplate($loginTemplate);
      $aliYun->Send();

      // 阿里云發(fā)找回密碼短信
      $aliYun->SetTemplate($findPwTemplate);
      $aliYun->Send();

      // 極光發(fā)登錄短信
      $jg->SetTemplate($loginTemplate);
      $jg->Send();

      // ......

      說(shuō)明

      • 這就是一種聚合模式。模板并不是短信發(fā)送的一部分,我們不使用模板直接發(fā)送也可以,它們沒有強(qiáng)關(guān)系

      • 短信發(fā)送商的發(fā)送方法無(wú)需改變,只需要傳入不同的短信模板就可以實(shí)現(xiàn)各種模板的快速發(fā)送

      • 在不確定是否一定是is-a的關(guān)系的情況下,更推薦用橋接模式這種組合/聚合形式的設(shè)計(jì)方法,如果確定當(dāng)前的類關(guān)系是is-a,那么就不要猶豫的用繼承吧

      下期看點(diǎn)

      上次提到過(guò)虛擬機(jī)軟件的橋接網(wǎng)絡(luò)模式,它的作用是類似于把物理主機(jī)虛擬為一個(gè)交換機(jī),所有橋接設(shè)置的虛擬機(jī)連接到這個(gè)交換機(jī)的一個(gè)接口上,物理主機(jī)也同樣插在這個(gè)交換機(jī)當(dāng)中,所以所有橋接下的網(wǎng)卡與網(wǎng)卡都是交換模式的,相互可以訪問而不干擾。其實(shí)和我們的設(shè)計(jì)模式很相似,將抽象對(duì)象看做是虛擬交換機(jī),實(shí)現(xiàn)類就是虛擬機(jī),通過(guò)對(duì)象的引用作為網(wǎng)線將它們連接在一起。看著簡(jiǎn)單的模式但想深入理解也是挺困難的吧?特別是它與其他模式很類似的時(shí)候。下回我們講的門面模式也是這樣,很好理解,但轉(zhuǎn)頭一想又會(huì)覺得跟其他一些模式很相似,所以,還是需要深入的理解才能更好的掌握這些模式,話不多說(shuō),下回見!

        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章