小蜜锋 - 云代码空间
—— 技术宅拯救世界!
有这样一个项目,做一个餐厅订餐系统。起初的代码结构是这样的。前面有很多Beverage的继承类,现在遇到的问题是牛奶的价钱上涨了,那么所有相关的类,我们都要进行调整,比如Milk,SugarAndMilk类,这种类还有很多,我们需要逐个去修改类中的方法——开发人员每次都做这种事情,要疯了!所以我们要改变现有的结构。以下的图都是简图,实际的图,可没有这么简单。
设计问题:
1》类数量爆炸,有很多类,难以维护;
2》整个设计呆板;
3》基类加入的新功能无法使用于子类;
后来经过小组研究决定,我们决定把基础类抽出来,比如,我们把咖啡做成一个单独的类,其他的咖啡,比如牛奶咖啡,甜味咖啡,我们只对材料单独包装成一个类。
经过改良的设计:
详解
1》对于饮品,我们直接继承Beverage类,直接把报价写进饮品类里面;
2》而对于一些需要添加调味品的特殊饮品,我们做累加操作。比如,我想要杯奶咖啡,则 总价=咖啡价+奶价
3》这样不同的饮料就很容易知道它的价格。
<?php abstract class Beverage{ public $_name; abstract public function Cost(); } // 被装饰者类 class Coffeeextends Beverage{ public function __construct(){ $this->_name ='Coffee'; } public function Cost(){ return 1.00; } } // 以下三个类是装饰者相关类 class CondimentDecoratorextends Beverage{ public function __construct(){ $this->_name ='Condiment'; } public function Cost(){ return 0.1; } } class Milkextends 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 Sugarextends 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.加点牛奶 $coffee =new Milk($coffee); //3.加点糖 $coffee =new Sugar($coffee); printf("Coffee Total:%0.2f元\n",$coffee->Cost()); |