有這樣一個(gè)項(xiàng)目,做一個(gè)餐廳訂餐系統(tǒng)。起初的代碼結(jié)構(gòu)是這樣的。前面有很多Beverage的繼承類,現(xiàn)在遇到的問題是牛奶的價(jià)錢上漲了,那么所有相關(guān)的類,我們都要進(jìn)行調(diào)整,比如Milk,SugarAndMilk類,這種類還有很多,我們需要逐個(gè)去修改類中的方法——開發(fā)人員每次都做這種事情,要瘋了!所以我們要改變現(xiàn)有的結(jié)構(gòu)。以下的圖都是簡(jiǎn)圖,實(shí)際的圖,可沒有這么簡(jiǎn)單。

設(shè)計(jì)問題:
1》類數(shù)量爆炸,有很多類,難以維護(hù);
2》整個(gè)設(shè)計(jì)呆板;
3》基類加入的新功能無(wú)法使用于子類;
后來(lái)經(jīng)過小組研究決定,我們決定把基礎(chǔ)類抽出來(lái),比如,我們把咖啡做成一個(gè)單獨(dú)的類,其他的咖啡,比如牛奶咖啡,甜味咖啡,我們只對(duì)材料單獨(dú)包裝成一個(gè)類。
經(jīng)過改良的設(shè)計(jì):

詳解
1》對(duì)于飲品,我們直接繼承Beverage類,直接把報(bào)價(jià)寫進(jìn)飲品類里面;
2》而對(duì)于一些需要添加調(diào)味品的特殊飲品,我們做累加操作。比如,我想要杯奶咖啡,則 總價(jià)=咖啡價(jià)+奶價(jià)
3》這樣不同的飲料就很容易知道它的價(jià)格。
<?php
abstract class Beverage{
public $_name;
abstract public function Cost();
}
// 被裝飾者類
class Coffee extends Beverage{
public function __construct(){
$this->_name = 'Coffee';
}
public function Cost(){
return 1.00;
}
}
// 以下三個(gè)類是裝飾者相關(guān)類
class CondimentDecorator extends Beverage{
public function __construct(){
$this->_name = 'Condiment';
}
public function Cost(){
return 0.1;
}
}
class Milk extends CondimentDecorator{
public $_beverage;
public function __construct($beverage){
$this->_name = 'Milk';
if($beverage instanceof Beverage){
$this->_beverage = $beverage;
}else
exit('Failure');
}
public function Cost(){
return $this->_beverage->Cost() + 0.2;
}
}
class Sugar extends CondimentDecorator{
public $_beverage;
public function __construct($beverage){
$this->_name = 'Sugar';
if($beverage instanceof Beverage){
$this->_beverage = $beverage;
}else{
exit('Failure');
}
}
public function Cost(){
return $this->_beverage->Cost() + 0.2;
}
}
// Test Case
//1.拿杯咖啡
$coffee = new Coffee();
//2.加點(diǎn)牛奶
$coffee = new Milk($coffee);
//3.加點(diǎn)糖
$coffee = new Sugar($coffee);
printf("Coffee Total:%0.2f元\n",$coffee->Cost());

浙公網(wǎng)安備 33010602011771號(hào)