本文實例講述了PHP設計模式之裝飾器模式定義與用法。分享給大家供大家參考,具體如下:
裝飾器模式:
如果已有對象的部分內容或功能性發(fā)生改變,但是不需要修改原始對象的結構或不使用繼承,動態(tài)的擴展一個對象的功能,則應該使用裝飾器模式。
簡單點說:就是我們不應該去修改已有的類,而是通過創(chuàng)建另外一個裝飾器類,通過這個裝飾器類去動態(tài)的擴展其需要修改的內容,這樣做的好處就是————
1、我們可以保證類的層次不會因過多而發(fā)生混亂。
2、當我們需求的修改很小時,不用改變原有的數(shù)據(jù)結構。
代碼引用自《PHP設計模式》。
- /**
- * 被修飾類
- 現(xiàn)在的需求:
- 要求能夠動態(tài)為CD添加音軌、能顯示CD音軌列表。
- 顯示時應采用單行并且為每個音軌都以音軌好為前綴。
- */
- class CD
- {
- public $trackList;
- function __construct()
- {
- # code...
- $this->trackList=array();
- }
- public function addTrack($track){
- $this->trackList[]=$track;
- }
- public function getTrackList(){
- $output=" ";
- foreach ($this->trackList as $key => $value) {
- # code...
- $output.=($key+1).") {$value}. ";
- }
- return $output;
- }
- }
- /*
- 現(xiàn)在需求發(fā)生變化:
- 要求將當前實例輸出的音軌都采用大寫形式。
- 這個需求并不是一個變化特別大的需求,不需要修改基類或創(chuàng)建一個父子關系的子類,此時創(chuàng)建一個基于裝飾器模式的裝飾器類。
- */
- class CDTrackListDecoratorCaps{
- private $_cd;
- public function __construct(CD $CD){
- $this->_cd=$CD;
- }
- public function makeCaps(){
- foreach ($this->_cd->trackList as $key => $value) {
- # code...
- $this->_cd->trackList[$key]=strtoupper($value); //轉換成大寫
- }
- }
- }
- //客戶端測試:
- $myCD=new CD();
- $trackList=array(
- "what It Means",
- "brr",
- "goodBye"
- );
- foreach ($trackList as $key => $value) {
- # code...
- $myCD->addTrack($value);
- }
- $myCDCaps=new CDTrackListDecoratorCaps($myCD);
- $myCDCaps->makeCaps();
- print "The CD contains the following tracks:".$myCD->getTrackList();
運行結果:
The CD contains the following tracks: 1) WHAT IT MEANS. 2) BRR. 3) GOODBYE.
新聞熱點
疑難解答