有这样一个项目,做一个餐厅订餐系统。起初的代码结构是这样的。前面有很多beverage的继承类,现在遇到的问题是牛奶的价钱上涨了,那么所有相关的类,我们都要进行调整,比如milk,sugarandmilk类,这种类还有很多,我们需要逐个去修改类中的方法——开发人员每次都做这种事情,要疯了!所以我们要改变现有的结构。以下的图都是简图,实际的图,可没有这么简单。
<?
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;
}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.加点牛奶
$coffee = new milk($coffee);
//3.加点糖
$coffee = new sugar($coffee);
printf("coffee total:%0.2f元\n",$coffee->cost());
1.利用继承设计子类行为,是在编译时静态决定的,而且所有的子类都会继承到相同的行为。打个比方,老子想学点功夫,看你小子会太极拳,老子只需要继承你一下 ,老子也就会太极拳了——呵呵,这时老子就变成你儿子了,看来继承是要付出代价的。
2.组合,我们可以扩展对象的行为,在运行时动态地进行扩展。利用组合我们可以随时把我们当时设计超类时没有想到的方法加入到对象中,而不用改变现有的代码。打个比方,老子现在没有内力,吸功大法,把和尚,尼姑,道士的内力(行为对象)都吸过来,那在搏斗(运行时)中,老子可以随时都能使用不同的内力,但也不能胡乱吸内力,否则你就要走火入魔了!
3.类应该对扩展开放,对修改关闭。如果我们每个部分都用装饰者模式进行设计,那么对于整个框架来说有点浪费,而且你也加大了代码的难度。那什么时候使用这种模式呢?我们一般用于经常改变的地方。那我们又怎么知道哪些是经常改变的地方呢?这个就需要我们的经验和你对所处行业的了解。建议大家平时多看点例子。
评论列表:
发布于 3天前回复该评论
发布于 3天前回复该评论
发布于 3天前回复该评论
发布于 3天前回复该评论
发布于 2天前回复该评论
发布于 2天前回复该评论
发布于 2天前回复该评论
发布于 2天前回复该评论