(2)當某個對象的職責常常發生變化或者常常須要動態的增長職責,避免爲了適應這樣的變化,而增長繼承子類擴展的方式,由於這種方式會形成子類膨脹的速度過快,難以控制。(有效控制類層次結構) php
3.與類繼承的比較:
(1) 裝飾器與繼承的目的都是擴展對象的功能,但裝飾器提供了比繼承更大的靈活性,能夠動態的決定是「粘上」仍是「去掉」一個裝飾。
(2)裝飾器比繼承關係使用更少的類,但比繼承關係使用更多的對象,更多的對象會使查錯變得更困難,特別是這些對象看上去很像的時候。
this
4.代碼示例: spa
<?php /** * * @author top * */ class CD { //cd track public $tracklists; /** */ public function __construct() { $this->tracklists = array(); } public function addTrack($track) { $this->tracklists[] = $track; } /** * @return string */ public function getTrackLists() { $output = ''; foreach ($this->tracklists as $num => $track) { $output .= ($num + 1) . ") {$track} ."; } return $output; } } ?>
<?php /** * CD類裝飾器,對每條CD track進行大寫轉換 * @author top * */ class CDTrackListDecoratorCaps { /** * @var CD */ private $_cd ; public function __construct(CD $cd) { $this->_cd = $cd; } public function makeCaps() { foreach ($this->_cd->tracklists as $k => $track) { $this->_cd->tracklists[$k] = strtoupper($track); //大寫轉換 } } } ?>