装饰者模式
2016-06-01 15:27
375 查看
设计类应该对修改关闭,对扩展开放。
使用装饰者模式:
1.装饰者和被装饰者必须有相同的超类型。
2.可以用一个或多个装饰者包装一个对象。
3.装饰者和被装饰者拥有相同的超类型,所以可以使用装饰者的地方也可以使用装饰过的对象取代它。
4.装饰者可以在所委托的被装饰者的行为之前或者之后添加上自己的行为,达到装饰的目的。
5.对象可以在任何时候被装饰,所以可以在运行时动态的不限量的被装饰。
装饰者模式动态的将责任附加到对象上去,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
UML类图
代码:
测试:
结果:
如果需要其他调料,就可以不修改原有的代码来实现了。对修改关闭,对扩展开放。
虽然继承可以添加扩展,但不见得是达到弹性设计的最佳方式,组合和委托可用于在运动时添加新的行为。
过多的装饰者会导致设计中出现许多的小对象。会让程序变得复杂
有些代码会依赖于特定的类型。
使用装饰者模式:
1.装饰者和被装饰者必须有相同的超类型。
2.可以用一个或多个装饰者包装一个对象。
3.装饰者和被装饰者拥有相同的超类型,所以可以使用装饰者的地方也可以使用装饰过的对象取代它。
4.装饰者可以在所委托的被装饰者的行为之前或者之后添加上自己的行为,达到装饰的目的。
5.对象可以在任何时候被装饰,所以可以在运行时动态的不限量的被装饰。
装饰者模式动态的将责任附加到对象上去,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
UML类图
代码:
超类饮料接口 interface Beverage { public function cost(); public function description(); }
饮料类 class Tea implements Beverage { public function cost() { return 1.1; } public function description() { return 'green tea'; } } class Coffe implements Beverage { public function cost() { return 2.2; } public function description() { return 'black coffe'; } }
调料类 1 class AddSalt implements Beverage { private $beverage; public function __construct(Beverage $beverage) { $this -> beverage = $beverage; } public function cost() { return $this -> beverage -> cost() + 0.5; } public function description() { return 'Salt '.$this -> beverage -> description(); } } class AddSugger implements Beverage { private $beverage; public function __construct(Beverage $beverage) { $this -> beverage = $beverage; } public function cost() { return $this -> beverage -> cost() + 0.6; } public function description() { return 'Sugger '.$this -> beverage -> description(); } }
测试:
$tea = new Tea(); $tea = new AddSugger($tea); $tea = new AddSalt($tea); print_r($tea -> description());
结果:
Salt Sugger green tea
如果需要其他调料,就可以不修改原有的代码来实现了。对修改关闭,对扩展开放。
虽然继承可以添加扩展,但不见得是达到弹性设计的最佳方式,组合和委托可用于在运动时添加新的行为。
过多的装饰者会导致设计中出现许多的小对象。会让程序变得复杂
有些代码会依赖于特定的类型。
相关文章推荐
- Altium Designer 之【差分线】和【等长线】
- iOS开发之NSLog的使用
- 【Android基础】四、四大组件(二)
- UART和RS232/RS485的关系是什么?
- Fast RCNN训练自己的数据集 (2修改读写接口)
- 3 more 和less等命令
- 浅谈货源清单
- ext 6.0框架结构
- 嵌入式ARM多核处理器并行化方法
- leetcode 198. House Robber
- Core Animation核心动画
- Javascript继承
- UVa 111 History Grading (简单DP,LIS或LCS)
- mysql编码设置 [http://blog.knowsky.com/254652.htm]
- Fiddler使用指南
- 情炽——Tacke竹桑(中国风)
- 多功能的PagerSlidingTabStrip
- putty提示Network error:Software caused connection abort解决方法
- linux安装tomcat
- XTU 1236 Fraction(小数化分数)