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