[toc]
组合模式和装饰者模式#
一、组合模式#
该模式的意义:
用于树类, 或者支持将多个A对象合成1个A对象的 情形下
该模式的意义:
用于树类, 或者支持将多个A对象合成1个A对象的 情形下
主要方法:
- 基类( 包含add或insert方法 )
- 子类 包括 叶子类 和 非叶类
- 非叶类 即可以add 叶子, 叶可以 add非叶。
- 其实就是 子类里可以包含父类容器,不断添加、延伸。
计算引擎中的GNODE、logicalNode就是这种。
优点#
-
客户端调用简单,客户端可以一致的使用组合结构或其中单个对象。
-
可以形成复杂的树形结构。
-
更容易在组合体内加入对象构件,客户端不必因为加入了新的对象构件而更改原有代码。
缺点#
使设计变得更加抽象,对象的业务规则如果很复杂,则实现组合模式具有很大挑战性
而且不是所有的方法都与叶子对象子类都有关联
要注意使用场景
二、装饰者模式#
如果我们 对某个 类, 以后可能会有很多小的修改加上去, 而且都是“装饰”性质的, 即加“功能”,而且这些功能可以一层层叠加
如果加功能频率很多,我们可以用装饰者模式。 经典应用就是java中的stream流
new XXXStream(new BufferStream(new FileOutputStream()))
Q: 装饰模式和组合模式都是成员里会包含自己这个类或者子类,区别是?#
A:
组合模式, 重点体现在用成员类组成一个树形或者图型结构(重点不在于做事情), 使用者会关心成员类的内容且可能会遍历。
装饰者模式,重点体现在用成员类的方法做相同的事情,自己再做一些补充, 且可以不断叠加。 叠加后只提供一个最终叠加后的对象给别人使用, 别人不用关心里面叠加的那些中间对象。
Q: 装饰着模式和proxy代理模式又有什么区别? 代理模式也是用成员的方法调用之后,再做一些额外处理#
A:
- 使用代理模式,代理和真实对象之间的的关系通常在编译时就已经确定了。 注意AOP里的所有代理对象其实都是编译时定好了用哪个代理
- 而 装饰者能够在运行时递归地被构造,即运行期可以设置不同的装饰对象做装饰, 但是代理的话,代理是固定的,只不过可能会选用不同的代理罢了。