如果已有物件的部分內容或功能發生改變,但是不修改原始物件的結構,也不使用擴充套件類時,可以使用裝飾器模式。
class cd
public function addtrack($track) //向cd中新增一首歌
public function gettracklist()";}
return $output;}}
呼叫時:
$trackextends=array('over my head','wake me up','faint');
$mycd=new cd();
foreach($arrayextends as $track)
$mycd->addtrack($track);
現在功能要把track的名字變為大寫,在不修改原類和不使用繼承的情況下,使用裝飾器模式
class cddecorator
public function makecaps
}再次呼叫時:
$arrayextends=array('over my head','wake me up','faint');
$mycd=new cd();
foreach($arrayextends as $track)
$mycd->addtrack($track);
$mycddecorator=new cddecorator($mycd);
$mycddecorator->makecaps(); //完成了對cd中track變大寫的功能
把要裝飾的物件的乙個例項作為裝飾類的私有物件,進行加工處理,得到需要的功能
通過分配或委託至其它物件,委託設計模式能夠去除核心物件中的條件判斷和複雜的功能性。
class playlist
public function addsong($location,$title)
public function getm3u()
public function getpls()
}呼叫時:
$playlist=new playlist();
$playlist->addsong('/music/taylor/1.***,'you belong with me'');
$playlist->addsong('/music/linkin/6.***,'*****cut'');
if($externalretrievedtype=='pls')
$playlistcontent=$playlist->getpls();
else
$playlistcontent=$playlist->getm3u();
可以看到現在只有兩種可以判斷,如果之後再新增新的分類,更改維護起來會很麻煩
下面用委託模式來解決:
class newplaylist
playlist";
$this->__typeobject=new $object;
}public function addsong($location,$title)
public function getplaylist()
}下面構造每個種類的委託類
class m3uplaylistdelegate
}class plsplaylistdelegate
}呼叫時:
$extype='pls';
$playlist=new newplaylist($extype);
$content=$playlist->getplaylist();
這樣,當增加新的型別時,開發人員不用修改上面的**,只需要再寫乙個新的委託類就能完成功能。
委託模式去除了核心物件的複雜性並且能夠動態新增新的功能。
在應用程序中的乙個步驟抱恨許多複雜的邏輯步驟和方法呼叫時,建立乙個機遇外觀模式的物件
外觀模式隱藏了來自呼叫物件的複雜性
class cd
class cduppercase
class cdmakexml
之所以不把這兩個類實現的功能直接加入cd類中,而是單獨建類時為了之後重用方便著想。
呼叫時:
cduppercase::makestring($cd,'title');
cduppercase::makestring($cd,'band');
print cdmakexml::create($cd);
用外觀模式來實現:
class webservicefacade
$xml=cdmakexml::create($cd);
return $xml;
} 如果已有物件的部分內容或功能發生改變,但是不修改原始物件的結構,也不使用擴充套件類時,可以使用裝飾器模式。
class cd
public function addtrack($track) //向cd中新增一首歌
public function gettracklist()";}
return $output;}}
呼叫時:
$trackextends=array('over my head','wake me up','faint');
$mycd=new cd();
foreach($arrayextends as $track)
$mycd->addtrack($track);
現在功能要把track的名字變為大寫,在不修改原類和不使用繼承的情況下,使用裝飾器模式
class cddecorator
public function makecaps
}再次呼叫時:
$arrayextends=array('over my head','wake me up','faint');
$mycd=new cd();
foreach($arrayextends as $track)
$mycd->addtrack($track);
$mycddecorator=new cddecorator($mycd);
$mycddecorator->makecaps(); //完成了對cd中track變大寫的功能
通過分配或委託至其它物件,委託設計模式能夠去除核心物件中的條件判斷和複雜的功能性。
class playlist
public function addsong($location,$title)
public function getm3u()
public function getpls()
}呼叫時:
$playlist=new playlist();
$playlist->addsong('/music/taylor/1.***,'you belong with me'');
$playlist->addsong('/music/linkin/6.***,'*****cut'');
if($externalretrievedtype=='pls')
$playlistcontent=$playlist->getpls();
else
$playlistcontent=$playlist->getm3u();
可以看到現在只有兩種可以判斷,如果之後再新增新的分類,更改維護起來會很麻煩
下面用委託模式來解決:
class newplaylist
playlist";
$this->__typeobject=new $object;
}public function addsong($location,$title)
public function getplaylist()
}下面構造每個種類的委託類
class m3uplaylistdelegate
}class plsplaylistdelegate
}呼叫時:
$extype='pls';
$playlist=new newplaylist($extype);
$content=$playlist->getplaylist();
這樣,當增加新的型別時,開發人員不用修改上面的**,只需要再寫乙個新的委託類就能完成功能。
委託模式去除了核心物件的複雜性並且能夠動態新增新的功能。
在應用程序中的乙個步驟抱恨許多複雜的邏輯步驟和方法呼叫時,建立乙個機遇外觀模式的物件
外觀模式隱藏了來自呼叫物件的複雜性
class cd
class cduppercase
class cdmakexml
之所以不把這兩個類實現的功能直接加入cd類中,而是單獨建類時為了之後重用方便著想。
呼叫時:
cduppercase::makestring($cd,'title');
cduppercase::makestring($cd,'band');
print cdmakexml::create($cd);
用外觀模式來實現:
class webservicefacade
$xml=cdmakexml::create($cd);
return $xml;
}
php設計模式之裝飾器模式
裝飾者模式動態地將責任附加到物件上。若要擴充套件功能,裝飾者提供了比 繼承更有彈性的替代方案。有這樣乙個專案,做乙個餐廳訂餐系統。起初的 結構是這樣的。前面有很多beverage的繼承類,現在遇到的問題是牛奶的價錢 了,那麼所有相關的類,我們都要進行調整,比如milk,sugarandmilk類,這...
PHP設計模式之裝飾器模式
修飾模式,是物件導向程式設計領域中,一種動態地往乙個類中新增新的行為的設計模式。就功能而言,修飾模式相比生成子類更為靈活,這樣可以給某個物件而不是整個類新增一些功能。將所有的功能建立在繼承體系上會導致系統中的類越來越多,而且當你又要修改他們的分支的時候,可能還會出現重複 我們來看下面這個例子,為了計...
php設計模式之裝飾器模式
裝飾器模式 可以動態的新增,修改某乙個類的功能 特點 1 建立乙個可以被其他類可以實現的類 2 建立乙個功能類去實現剛才定義的類 發現 裝飾器模式與觀察者模式,介面卡模式,這幾種模式存在著一定的相似關係 定義乙個可以實現的類 inte ce decorator public function aft...