久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      深入淺析PHP中的建造者模式

      在之前的文章《淺談PHP中的中介者模式》中我們介紹了PHP中的中介者模式,下面本篇文章帶大家了解一下PHP設(shè)計模式中的建造者模式。

      深入淺析PHP中的建造者模式

      建造者模式,也可以叫做生成器模式,builder這個詞的原意就包含了建筑者、開發(fā)者、創(chuàng)建者的含義。很明顯,這個模式又是一個創(chuàng)建型的模式,用來創(chuàng)建對象。那么它的特點(diǎn)是什么呢?從建筑上來說,蓋房子不是一下子就馬上能把一個房子蓋好的,而是通過一磚一瓦搭建出來的。一個房子不僅有磚瓦,還有各種管道,各種電線等等,由它們各個不部分共同組成了一棟房子??梢哉f,建造者模式就是這樣非常形象的由各種部件來組成一個對象(房子)的過程。

      Gof類圖及解釋

      GoF定義:將一個復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示

      GoF類圖

      深入淺析PHP中的建造者模式

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

      class Product {     private $parts = [];      public function Add(String $part): void     {         $this->parts[] = $part;     }      public function Show(): void     {         echo PHP_EOL . '產(chǎn)品創(chuàng)建 ----', PHP_EOL;         foreach ($this->parts as $part) {             echo $part, PHP_EOL;         }     } }

      產(chǎn)品類,你可以把它想象成我們要建造的房子。這時的房子還沒有任何內(nèi)容,我們需要給它添磚加瓦。

      interface Builder {     public function BuildPartA(): void;     public function BuildPartB(): void;     public function GetResult(): Product; }  class ConcreteBuilder1 implements Builder {     private $product;      public function __construct()     {         $this->product = new Product();     }      public function BuildPartA(): void     {         $this->product->Add('部件A');     }     public function BuildPartB(): void     {         $this->product->Add('部件B');     }     public function GetResult(): Product     {         return $this->product;     } }  class ConcreteBuilder2 implements Builder {     private $product;      public function __construct()     {         $this->product = new Product();     }      public function BuildPartA(): void     {         $this->product->Add('部件X');     }     public function BuildPartB(): void     {         $this->product->Add('部件Y');     }     public function GetResult(): Product     {         return $this->product;     } }

      建造者抽象及其實(shí)現(xiàn)。不同的開發(fā)商總會選用不同的品牌材料,這里我們有了兩個不同的開發(fā)商,但他們的目的一致,都是為了去蓋房子(Product)。

      class Director {     public function Construct(Builder $builder)     {         $builder->BuildPartA();         $builder->BuildPartB();     } }

      構(gòu)造器,用來調(diào)用建造者進(jìn)行生產(chǎn)。沒錯,就是我們的工程隊。它來選取材料并進(jìn)行建造。同樣的工程隊,可以接不同的單,但蓋出來的都是房子。只是這個房子的材料和外觀不同,大體上的手藝還是共通的。

      $director = new Director(); $b1 = new ConcreteBuilder1(); $b2 = new ConcreteBuilder2();  $director->Construct($b1); $p1 = $b1->getResult(); $p1->Show();  $director->Construct($b2); $p2 = $b2->getResult(); $p2->Show();

      最后看看我們的實(shí)現(xiàn),是不是非常簡單,準(zhǔn)備好工程隊,準(zhǔn)備好不同的建造者,然后交給工程隊去生產(chǎn)就好啦??!

      • 其實(shí)這個模式要解決的最主要問題就是一個類可能有非常多的配置、屬性,這些配置、屬性也并不全是必須要配置的,一次性的實(shí)例化去配置這些東西非常麻煩。這時就可以考慮讓這些配置、屬性變成一個一個可隨時添加的部分。通過不同的屬性組合拿到不同的對象。
      • 上面那一條,在GoF那里的原文是:它使你改變一個產(chǎn)品的內(nèi)部表示;它將構(gòu)造代碼和表示代碼分開;它使你可以對構(gòu)造過程進(jìn)行更精細(xì)的控制。
      • 再說得簡單一點(diǎn),對象太復(fù)雜,我們可以一部分一部分的拼裝它!
      • 了解過一點(diǎn)Android開發(fā)的一定不會陌生,創(chuàng)建對話框?qū)ο驛lterDialog.builder
      • Laravel中,數(shù)據(jù)庫組件也使用了建造者模式,你可以翻看下源碼中DatabaseEloquent和DatabaseQuery目錄中是否都有一個Builder.php

      大家都知道,手機(jī)組裝是一件復(fù)雜的過程,于是,不同型號的手機(jī)我們都有對應(yīng)的圖紙(Builder),將圖紙和配件交給流水線上的工人(Director),他們就會根據(jù)圖紙使用配件來生產(chǎn)出我們所需要的各種不同型號的手機(jī)(Product)。很明顯,我們都是偉大的建造者,為我們的產(chǎn)業(yè)添磚加瓦?。?!

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

      實(shí)例

      前面說過Android中有很多Dialog對話框都會用建造者模式來實(shí)現(xiàn),作為一家手機(jī)廠的老板,定制化的Android系統(tǒng)也是非常重要的一個部分。就像X米一樣,從MIUI入手,先拿下了軟件市場,讓大家覺得這個系統(tǒng)非常好用,然后再開始開發(fā)手機(jī)。這就說明軟硬件的確是現(xiàn)代手機(jī)的兩大最重要的組成部分,缺了誰都不行。這回,我們就用建造者模式簡單的實(shí)現(xiàn)一套對話框組件吧!

      對話框類圖

      深入淺析PHP中的建造者模式

      完整源碼:https://github.com/zhangyue0503/designpatterns-php/blob/master/16.builder/source/builder-dialog.php

      <?php  class Dialog {     private $attributes = [];     private $buttons = [];     private $title = '';     private $content = '';      public function AddAttributes($attr)     {         $this->attributes[] = $attr;     }     public function AddButtons($button)     {         $this->buttons[] = $button;     }     public function SetTitle($title)     {         $this->title = $title;     }     public function SetContent($content)     {         $this->content = $content;     }      public function ShowDialog(){         echo PHP_EOL, '顯示提示框 === ', PHP_EOL;         echo '標(biāo)題:' . $this->title, PHP_EOL;         echo '內(nèi)容:' . $this->content, PHP_EOL;         echo '樣式:' . implode(',', $this->attributes), PHP_EOL;         echo '按扭:' . implode(',', $this->buttons), PHP_EOL;     } }  interface Builder {     public function BuildAttribute($attr);     public function BuildButton($button);     public function BuildTitle($title);     public function BuildContent($content);     public function GetDialog(); }  class DialogBuilder implements Builder{     private $dialog;     public function __construct(){         $this->dialog = new Dialog();     }     public function BuildAttribute($attr){         $this->dialog->AddAttributes($attr);     }     public function BuildButton($button){         $this->dialog->AddButtons($button);     }     public function BuildTitle($title){         $this->dialog->SetTitle($title);     }     public function BuildContent($content){         $this->dialog->SetContent($content);     }     public function GetDialog(){         return $this->dialog;     } }  class DialogDirector {     public function Construct($title, $content){          $builder = new DialogBuilder();          $builder->BuildAttribute('置于頂層');         $builder->BuildAttribute('居中顯示');          $builder->BuildButton('確認(rèn)');         $builder->BuildButton('取消');          $builder->BuildTitle($title);         $builder->BuildContent($content);                  return $builder;     } }  class ModalDialogDirector {     public function Construct($title, $content){          $builder = new DialogBuilder();          $builder->BuildAttribute('置于頂層');         $builder->BuildAttribute('居中顯示');         $builder->BuildAttribute('背景庶照');         $builder->BuildAttribute('外部無法點(diǎn)擊');          $builder->BuildButton('確認(rèn)');         $builder->BuildButton('取消');          $builder->BuildTitle($title);         $builder->BuildContent($content);                  return $builder;     } }  $d1 = new DialogDirector(); $d1->Construct('窗口1', '確認(rèn)要執(zhí)行操作A嗎?')->GetDialog()->ShowDialog();  $d2 = new ModalDialogDirector(); $d2->Construct('窗口2', '確認(rèn)要執(zhí)行操作B嗎?')->GetDialog()->ShowDialog();

      說明

      • 這回我們的產(chǎn)品就有點(diǎn)復(fù)雜了,有標(biāo)題、內(nèi)容、屬性、按扭等
      • 建造過程其實(shí)都一樣,但這里我們主要使用了不同的構(gòu)造器。普通對話框外面的東西是可以點(diǎn)擊的,而模態(tài)窗口一般會有遮罩層,就是背景變成透明黑,而且外面的東西是不能再點(diǎn)擊的
      • 如果每次都直接通過構(gòu)造方法去實(shí)例化窗口類,那要傳遞的參數(shù)會很多,而現(xiàn)在這樣,我們就可以通過建造者來進(jìn)行組合,讓對象具有多態(tài)的效果,能夠呈現(xiàn)不同的形態(tài)及功能

      原文地址:https://juejin.cn/post/6844903981836320781

      作者:硬核項(xiàng)目經(jīng)理

      推薦學(xué)習(xí):《PHP視頻教程》

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號