在没必要转变原类文件和运用继续的情况下,动态地扩大一个对象的功用。它是经由过程建立一个包装对象,也就是装潢来包裹实在的对象。
装潢形式的特征
(1) 装潢对象和实在对象有雷同的接口。如许客户端对象就能以和实在对象雷同的体式格局和装潢对象交互。
(2) 装潢对象包括一个实在对象的援用(reference)
(3) 装潢对象接收一切来自客户端的请求。它把这些请求转发给实在的对象。
(4) 装潢对象能够在转发这些请求之前或今后增添一些附加功用。如许就确保了在运行时,不必修正给定对象的组织就能够在外部增添附加的功用。在面向对象的设想中,通常是经由过程继续来完成对给定类的功用扩大。
长处
1. Decorator形式与继续关联的目标都是要扩大对象的功用,然则Decorator能够供应比继续更多的灵活性。
2. 经由过程运用差别的细致装潢类以及这些装潢类的排列组合,设想师能够创造出很多差别行动的组合。
瑕玷
1. 这类比继续越发灵活机动的特征,也同时意味着越发多的庞杂性。
2. 装潢形式会致使设想中涌现很多小类,假如过分运用,会使顺序变得很庞杂。
3. 装潢形式是针对笼统组件(Component)范例编程。然则,假如你要针对细致组件编程时,就应该从新思索你的运用架构,以及装潢者是不是适宜。固然也能够转变Component接口,增添新的公然的行动,完成“半透明”的装潢者形式。在现实项目中要做出最好挑选。
php代码实例
笼一致个工人类具有工作要领,2个子类(水督工、木匠)完成了工人接口:
interface worker{ public function doSomeWork(); } //水督工 class shuiguan implements worker{ public function doSomeWork(){ echo '修水管'; } } //木匠 class mu implements worker{ public function doSomeWork(){ echo '修门窗'; } }
如今有新的需求a公司的工人(包括水管、木匠)进门请求先说“您好!”,我们想在不影响基本类的情况下一致完成这个功用。我们能够运用装潢形式类完成:
//a公司工人 class aWorker implements worker{ //细致的工人 public $worker; //组织函数猎取工人 public function __construct($worker){ $this->worker = $worker; } public function doSomeWork(){ echo '您好!'; $this->worker->doSomeWork(); } } $aWorker = new aWorker(new shuiguan()); $aWorker->doSomeWork();
aWorker 一样完成了worker类的接口,它须要一个细致的工人对象,在实行完特殊请求(说您好)后运用原有工人对象的要领。这就是装潢形式!
以上就是装潢形式详解的细致内容,更多请关注ki4网别的相干文章!