【php設計模式】裝飾器模式

  裝飾器模式,顧名思義,就是對已經存在的某些類進行裝飾,以此來擴展一些功能。其結構圖以下:php

  • Component爲統一接口,也是裝飾類和被裝飾類的基本類型。
  • ConcreteComponent爲具體實現類,也是被裝飾類,他自己是個具備一些功能的完整的類。
  • Decorator是裝飾類,實現了Component接口的同時還在內部維護了一個ConcreteComponent的實例,並能夠經過構造函數初始化。而Decorator自己,一般採用默認實現,他的存在僅僅是一個聲明:我要生產出一些用於裝飾的子類了。而其子類纔是賦有具體裝飾效果的裝飾產品類。
  • ConcreteDecorator是具體的裝飾產品類,每一種裝飾產品都具備特定的裝飾效果。能夠經過構造器聲明裝飾哪一種類型的ConcreteComponent,從而對其進行裝飾。
<?php

/**
*裝飾器模式
**/

interface Component{
    public function operation();
}

class ConcreteComponent implements Component{
    public $put_str = "具體實現類";
    
    public function operation(){
        echo $this->put_str."\n";
    }

    public function addElement($str){
        $this->put_str = $str.$this->put_str;
    }
}

abstract class Decorator implements Component{
    public $comm;
    public function __construct(Component $comm){
        $this->comm = $comm;
    }
    abstract function operation();
}

class ConcreteDecoratorA extends Decorator{
    public function operation(){
        $this->comm->addElement("被A修飾後的");
        $this->comm->operation();
    }
}

class ConcreteDecoratorB extends Decorator{
    public function operation(){
        $this->comm->addElement("被B修飾後的");
        $this->comm->operation();
    }
}

$comm = new ConcreteComponent();
$comm->operation();    // 輸出 「具體實現類」
$decorate_a = new ConcreteDecoratorA($comm);
$decorate_a->operation();  // 輸出 「被A修飾後的具體實現類」
$decorate_b = new ConcreteDecoratorB($comm);
$decorate_b->operation();  // 輸出 「被B修飾後的被A修飾後的具體實現類」

何時使用?:通常的,咱們爲了擴展一個類常常使用繼承方式實現,因爲繼承爲類引入靜態特徵,而且隨着擴展功能的增多,子類會很膨脹。在不想增長不少子類的狀況下擴展類可使用這種設計模式設計模式

相關文章
相關標籤/搜索