0%

组合模式和装饰者模式

[toc]

组合模式和装饰者模式#

一、组合模式#

该模式的意义:
用于树类, 或者支持将多个A对象合成1个A对象的 情形下
8953af0abe9db9e2badbc02eacbeb5a0325e0ab6
该模式的意义:
用于树类, 或者支持将多个A对象合成1个A对象的 情形下

主要方法:

  • 基类( 包含add或insert方法 )
  • 子类 包括 叶子类 和 非叶类
  • 非叶类 即可以add 叶子, 叶可以 add非叶。
  • 其实就是 子类里可以包含父类容器,不断添加、延伸。

计算引擎中的GNODE、logicalNode就是这种。

32a2333013afb0eb27642c817eb4e8de9d0f1cc7

优点#

  1. 客户端调用简单,客户端可以一致的使用组合结构或其中单个对象。

  2. 可以形成复杂的树形结构。

  3. 更容易在组合体内加入对象构件,客户端不必因为加入了新的对象构件而更改原有代码。

缺点#

使设计变得更加抽象,对象的业务规则如果很复杂,则实现组合模式具有很大挑战性
而且不是所有的方法都与叶子对象子类都有关联
要注意使用场景

二、装饰者模式#

如果我们 对某个 类, 以后可能会有很多小的修改加上去, 而且都是“装饰”性质的, 即加“功能”,而且这些功能可以一层层叠加
如果加功能频率很多,我们可以用装饰者模式。 经典应用就是java中的stream流
new XXXStream(new BufferStream(new FileOutputStream()))
d96605fa973db16ce93300c7e89582aa219dec2f

Q: 装饰模式和组合模式都是成员里会包含自己这个类或者子类,区别是?#

A:
组合模式, 重点体现在用成员类组成一个树形或者图型结构(重点不在于做事情), 使用者会关心成员类的内容且可能会遍历。
装饰者模式,重点体现在用成员类的方法做相同的事情,自己再做一些补充, 且可以不断叠加。 叠加后只提供一个最终叠加后的对象给别人使用, 别人不用关心里面叠加的那些中间对象。


Q: 装饰着模式和proxy代理模式又有什么区别? 代理模式也是用成员的方法调用之后,再做一些额外处理#

A:

  • 使用代理模式,代理和真实对象之间的的关系通常在编译时就已经确定了。 注意AOP里的所有代理对象其实都是编译时定好了用哪个代理
  • 而 装饰者能够在运行时递归地被构造,即运行期可以设置不同的装饰对象做装饰, 但是代理的话,代理是固定的,只不过可能会选用不同的代理罢了。