我現在就讀的裝飾圖案,在這裏一些示例代碼(PHP):裝飾模式問題 - 如何調用嵌套裝飾方法?
abstract class component{
public function drawShape(){};
}
class concreteComponent extends component{
public function drawShape(){//code};
}
class decoratorComponent extends component{
private $component;
public function __construct($component){ $this->component=$component; }
public function drawShape(){
$this->component->drawShape();
}
}
class borderDecorator extends decoratorComponent{
public function drawShape(){
$this->drawBorder();
$this->component->drawShape();
}
public function setBorder(){};
public function drawBorder(){};
}
class bgColorDecorator extends decoratorComponent{
public function drawShape(){
$this->drawBgColor();
$this->component->drawShape();
}
public function setbgColor(){};
public function drawBgColor(){};
}
好了,現在:
$test=new concreteComponent();
$border=new borderDecorator($test);
$border->setBorder(10);
$bgColor= new bgColorDecorator($border);
$bgColor->setBgColor(#000);
現在我有飾有#000背景色的成分,一個10(某個單位)的邊界。
隨着
$bgColor->drawShape();
這意味着drawBgColor
+ drawBorder
+ drawShape
和所有權利,但:
如何修改或刪除邊框?
$bgColor-> ???
或博客類不能直接訪問邊境方法...
感謝
Mhm我正在學習一本書,你可以看看它的接口,所以我有同樣的方法drawShape(),我可以稱它不用擔心,如果我使用裝飾組件或沒有(我是對的?)@PeeHaa – Francesco
如果你的對象圖不是太複雜,只是在修飾器改變時重新構造整個圖。但是,如果這太多開銷,你可能會寫一個知道其他功能或插件的裝飾器。像'$ test = new ConcreteCmp(); $ pluggableCmp = new PluggableDecorator($ test); $ pluggableCmp.addFeature(new BorderFeature()); $ pluggableCmp.addFeature(new BGColorFeature())' – plalx
然後從$ pluggableCmp如何調用BorderFeature或BGColorFeature的方法來修改它們? @plalx – Francesco