裝飾者模式:
類的繼承能夠讓類的結構層次更明瞭,對於一些屬於類個性的方法一般硬編碼到子類中。在定程度上在繼承的類中硬編碼子類共同的方法,但是如果這些共同的方法比較多的話,這樣寫並不是最理智的方法,而且如果後期擴展的話,父類中的方法會越來越多,且實際使用的方法是子類根據需要選擇的,若要實現動態將職責附加到對象上,擴展功能,裝飾者提供了比繼承更具彈性的代替方案。
要點:
1. 裝飾者和被裝飾對象有相同的超類型。
2. 可以用一個或多個裝飾者包裝一個對象。
3. 裝飾者可以在所委託被裝飾者的行爲之前或之後,加上自己的行爲,以達到特定的目的。
4. 對象可以在任何時候被裝飾,所以可以在運行時動態的,不限量的用你喜歡的裝飾者來裝飾對象。
5. 裝飾模式中使用繼承的關鍵是想達到裝飾者和被裝飾對象的類型匹配,而不是獲得其行爲。
6. 裝飾者一般對組件的客戶是透明的,除非客戶程序依賴於組件的具體類型。在實際項目中可以根據需要爲裝飾者添加新的行爲,做到“半透明”裝飾者。
7. 適配器模式的用意是改變對象的接口而不一定改變對象的性能,而裝飾模式的用意是保持接口並增加對象的職責。
優點:
1. Decorator模式與繼承關係的目的都是要擴展對象的功能,但是Decorator可以提供比繼承更多的靈活性。
2. 通過使用不同的具體裝飾類以及這些裝飾類的排列組合,設計師可以創造出很多不同行爲的組合。
缺點:
1. 這種比繼承更加靈活機動的特性,也同時意味着更加多的複雜性。
2. 裝飾模式會導致設計中出現許多小類,如果過度使用,會使程序變得很複雜。
3. 裝飾模式是針對抽象組件(Component)類型編程。但是,如果你要針對具體組件編程時,就應該重新思考你的應用架構,以及裝飾者是否合適。當然也可以改變Component接口,增加新的公開的行爲,實現“半透明”的裝飾者模式。在實際項目中要做出最佳選擇。
//裝飾模式
class preson{
protected $age;
protected $name;
protected $birth;
public function __construct($age,$name,$birth){
$this->age=$age;
$this->name-$name;
$this->birth=$birth;
}
function say(){
echo "我是一人";
}
}
class teacter extends preson{
function say(){
echo "我是一老師";
}
}
class student extends preson{
function say(){
echo "我是一個學生";
}
}
class decorator extends preson{
protected $preson;
function __construct($preson){
$this->preson=$preson;
}
}
class decCountage extends decorator{
function count(){
return $this->preson->age+1;
}
}
//其他DECORTOR的子類……
class client{
static function main(){
$stu=new student(1,"kk",'9-8');
$decCountage=new decCountage($stu);
echo $decCountage->count();
}
}
client::main();