裝飾者模式

裝飾者模式(Decorator Pattern),是在沒必要改變原類文件和使用繼承的狀況下,動態的擴展一個對象的功能。它是經過建立一個包裝對象,也就是裝飾來包裹真實的對象。

1.使用裝飾者模式的時候須要注意一下幾點內容
(1)裝飾對象和真實對象有相同的接口。這樣客戶端對象就能夠以和真實對象相同的方式和裝飾對象交互。
(2)裝飾對象包含一個真實對象的引用。
(3)裝飾對象接受全部的來自客戶端的請求,它把這些請求轉發給真實的對象。
(4)裝飾對象能夠在轉發這些請求之前或之後增長一些附加功能。這樣就確保了在運行時,不用修改給定對象的結構就能夠在外部增長附加的功能。

2.適用裝飾者模式場合:
(1) 當咱們須要爲某個現有的對象,動態的增長一個新的功能或職責時,能夠考慮使用裝飾模式。

(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); //大寫轉換
		}
	}
}

?>
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息