php設計模式-裝飾器模式

PHP裝飾器模式

一、什麼是裝飾器模式?

定義:容許向一個現有的對象添加新的功能,同時又不改變其結構。這種類型的設計模式屬於結構型模式,它是做爲現有的類的一個包裝。html

簡單來講就是能夠動態的添加和修改類的功能編程

二、爲何要用裝飾器模式?

若是一個類提供了一項功能,如今須要修改或者添加額外的功能,傳統的編程模式是須要寫個子類集成它,並從新實現類的方法。使用裝飾模式僅需在運行時添加一個裝飾器對象便可實現。
這種模式建立了一個裝飾類,用來包裝原有的類,並在保持類方法簽名完整性的前提下,提供了額外的功能中

三、裝飾器模式的優勢

  • 咱們能夠保證類的層次不會因過多而發生混亂。
  • 當咱們需求的修改很小時,不用改變原有的數據結構。

三、示例代碼

/**
 * @purpose: 原始繪製圖形的類
 * Class Canvas
 */
class CanvasOld
{
    /**
     * @var array 存入待繪製的數據
     */
    public $data;

    /**
     * @purpose: 初始化的時候填入*
     * @param int $width 所繪圖形的寬度
     * @param int $high 所繪圖形的高度
     */
    public function init($width = 20, $high = 10)
    {
        for ($i = 0; $i < $width; $i++)
        {
            for($j = 0; $j < $high; $j++)
            {
                $this->data[$i][$j] = '*';
            }
        }
    }

    /**
     * @purpose: 繪製圖形
     */
    public function draw()
    {
        foreach ($this->data as $line)
        {
            foreach($line as $char)
            {
                echo $char;
            }
            echo '</br>';
        }
    }
}

/**
 * @purpose: 裝飾器接口類
 * Interface DrawDecorator
 */
interface DrawDecorator
{
    /**
     * @return mixed 開始繪製以前的方法
     */
    public function beforeDraw();

    /**
     * @return mixed 開始繪製以後的方法
     */
    public function afterDraw();
}

/**
 * @purpose: 顏色裝飾器
 * Class ColoerDecorator
 */
class ColoerDecorator implements DrawDecorator
{
    /**
     * @var string 顏色
     */
    public $color;

    public function __construct($color = 'red')
    {
        $this->color = $color;
    }

    /**
     * @return mixed 開始繪製以前的方法
     */
    public function beforeDraw()
    {
        echo "<div style='color:{$this->color}' >";
    }

    /**
     * @return mixed 開始繪製以後的方法
     */
    public function afterDraw()
    {
        echo '</div>';
    }
}


/**
 * @purpose: 字體大小裝飾器
 * Class FontSizeDecorator
 */
class FontSizeDecorator implements DrawDecorator
{
    /**
     * @var string 字體大小
     */
    public $fontSize;

    public function __construct($color = 'red')
    {
        $this->fontSize = $color;
    }

    /**
     * @return mixed 開始繪製以前的方法
     */
    public function beforeDraw()
    {
        echo "<div style='font-size:{$this->fontSize}' >";
    }

    /**
     * @return mixed 開始繪製以後的方法
     */
    public function afterDraw()
    {
        echo '</div>';
    }
}


/**
 * @purpose: 添加裝飾器後繪製圖形的類
 * Class Canvas
 */
class Canvas
{
    /**
     * @var array 存入待繪製的數據
     */
    public $data;

    /**
     * @var array 保存所添加裝飾的對象數組
     */
    public $_decorators;

    /**
     * @purpose: 初始化的時候填入*
     * @param int $width 所繪圖形的寬度
     * @param int $high 所繪圖形的高度
     */
    public function init($width = 20, $high = 10)
    {
        for ($i = 0; $i < $width; $i++)
        {
            for($j = 0; $j < $high; $j++)
            {
                $this->data[$i][$j] = '*';
            }
        }
    }

    /**
     * @purpose: 繪製圖形
     */
    public function draw()
    {
        $this->beforeDraw(); //調用裝飾器

        foreach ($this->data as $line)
        {
            foreach($line as $char)
            {
                echo $char;
            }
            echo '</br>';
        }

        $this->afterDraw(); //調用裝飾器
    }

    /**
     * @purpose: 添加裝飾器
     * @param DrawDecorator $decorator
     */
    public function addDecorator(DrawDecorator $decorator)
    {
        $this->_decorators[] = $decorator;
    }

    /**
     * @purpose: 開始繪製以前
     */
    public function beforeDraw()
    {
        foreach ($this->_decorators as $decorator)
        {
            $decorator->beforeDraw();
        }
    }

    /**
     * @purpose: 開始繪製以後
     */
    public function afterDraw()
    {
        //afterDraw中須要反着調用。
        $decorators = array_reverse($this->_decorators);
        foreach ($decorators as $decorator)
        {
            $decorator->afterDraw();
        }
    }
}

$cavas = new Canvas();
$cavas->addDecorator(new ColoerDecorator());    //添加顏色裝飾器
//$cavas->addDecorator(new FontSizeDecorator());  //一個類封裝一類功能,可按需添加
$cavas->draw();

本文爲袋鼠學習中的總結,若有轉載請註明出處:http://www.javashuo.com/article/p-hwwbofrw-dx.html設計模式

相關文章
相關標籤/搜索