下面是一個簡單類,幫助了解裝飾模式,希望能對大家有幫助,有些地方改成中文,便於了解。
我要到飯館吃飯,程序的結果是打印對我吃的東西的描述和計算價錢。
這樣一層一層的包下來, 像是大口袋套小口袋,就是所謂的裝飾模式。
//基類
class 食物{
var $des='食物';
var $cost;
function getdes(){
return $this->des;
}
function getcost(){
return $this->cost;
}
}
//被裝飾者類
class 米飯 extends 食物{
var $des="米飯";
var $cost=0.44;
}
//裝飾者類與被裝飾者繼承自同一個基類
class 菜 extends 食物{
var $obj;
var $des='';
var $cost;
}
//細分的裝飾者
class 炒土豆絲 extends 菜{
var $obj;
var $des='土豆絲';
var $cost=0.10;
function __construct($obj){
$this->obj=$obj;
}
function getdes(){
return $this->obj->getdes().$this->des;
}
function getcost(){
return $this->obj->getcost()+$this->cost;
}
}
//有一個細分的裝飾者
class 鹹菜 extends 菜{
var $obj;
var $des='鹹菜';
var $cost=0.10;
function __construct($obj){
$this->obj=$obj;
}
function getdes(){
return $this->obj->getdes().$this->des;
}
function getcost(){
return $this->obj->getcost()+$this->cost;
}
}
//更多的菜
......
//測試代碼
$午飯= new 米飯();
$午飯=new 土豆絲($午飯);
$午飯=new 鹹菜($午飯);
echo $午飯->getdes();//outputs 米飯土豆絲鹹菜
echo $午飯->getcost();//outputs 0.64