首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

装饰模式到底有什么用

2013-01-08 
装饰模式究竟有什么用?这两天在看装饰模式,例子倒是看懂了,但没明白究竟为什么要用它。普通的解释是可以减

装饰模式究竟有什么用?
这两天在看装饰模式,例子倒是看懂了,但没明白究竟为什么要用它。
普通的解释是可以减少子类,不必继承现有的类,但你为此写的装饰类难道不是类吗,有一种用途就要写一个装饰类,依我浅薄的理解,只是应了开闭原则而已,不必修改现有类,把新的任务委派给已有的组件类,然后添加一些行为,不知我理解是否正确。

为了便于说明,请参照http://www.jdon.com/designpatterns/decorator.htm,谢谢
[解决办法]
decorate模式理解为减少子类有问题~
事实上,decorate模式主要应用于解决如下问题:
1.在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
2.处理那些可以撤销的职责。

以下两种情况不适于使用decorate模式:
1. 可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长(LZ提到的情况)
2. 因为类定义被隐藏,或类定义不能用于生成子类

[解决办法]
这种需求,LZ用observe模式的思想确实可以很好的解决

coffee是基类,它拥有cost方法,这是coffee的基类方法
icecoffee继承coffee,它拥有加冰的方法addIce
milkcoffee继承coffee,它拥有加奶的方法addMilk
sugarcoffee继承coffee,它拥有加糖的方法addSugar

我现在想要一个对象,它具有icecoffee和milkcoffee的特点,即addIce和addMilk
我又想要一个对象,它具有icecoffee和sugarcoffee的特点,即addIce和addSugar
然后还有一个对象,它具有milkcoffee和sugarcoffee的特点,即addMilk和addSugar
然后,还有一个对象,它具有以上三种继承类的特点

弱问,list<coffee> how to solve this?
其实GOF和前面提到的blog都说的很清楚了
建议LZ先认真学习下





[解决办法]
其实你的疑问是对的

因为这个模式偏向于是一个重构型模式。
[解决办法]
是的,可以保留原有行为的基础上添加一些行为
或者  替换原有的行为
[解决办法]
这个模式现实中用的好像不多,new来new去的也不是很优雅

热点排行