装饰模式(Decorator Pattern)
装饰模式 动态的将责任附加到对象上。
装饰模式是在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能。它是通过创建一个包装对象,页就是装饰来包裹真实的对象。
Decorator Pattern UMP map More Detail
装饰模式优点
- 装饰模式与继承关系的目的都是要扩展对象的功能,但是装饰模式可以提供比继承更多的灵活。装饰模式允许系统动态决定“贴上”一个需要的“装饰”,或者除掉一个不需要的“装饰”。继承关系则不同,继承关系是静态的,它在系统运行前就决定了。
- 避免在层次结构高层的类有太多的特征
- 通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。
装饰模式的缺点
- 使用装饰模式会产生比使用继承关系更多的对象
- 对象很像,排查错误比较困难
主题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| <?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());
|