PHP設計模式之裝飾者模式
有這樣一個專案,做一個餐廳訂餐系統。起初的程式碼結構是這樣的。前面有很多Beverage的繼承類,現在遇到的問題是牛奶的價錢上漲了,那麼所有相關的類,我們都要進行調整,比如Milk,SugarAndMilk類,這種類還有很多,我們需要逐個去修改類中的方法——開發人員每次都做這種事情,要瘋了!所以我們要改變現有的結構。以下的圖都是簡圖,實際的圖,可沒有這麼簡單。
設計問題:
1》類數量爆炸,有很多類,難以維護;
2》整個設計呆板;
3》基類加入的新功能無法使用於子類;
複用類方法的方式很多,比如繼承,組合,委託。為什麼老是習慣用繼承呢?我看Zend Framework也有這種習慣!每次找對應方法,一直往上翻。——題外話!!!!後來經過小組研究決定,我們決定把基礎類抽出來,比如,我們把咖啡做成一個單獨的類,其他的咖啡,比如牛奶咖啡,甜味咖啡,我們只對材料單獨包裝成一個類。
經過改良的設計:
詳解
1》對於飲品,我們直接繼承Beverage類,直接把報價寫進飲品類裡面;
2》而對於一些需要新增調味品的特殊飲品,我們做累加操作。比如,我想要杯奶咖啡,則 總價=咖啡價+奶價
3》這樣不同的飲料就很容易知道它的價格。
程式碼
<?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;
}
}
//
以下三個類是裝飾者相關類
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
|