组合模式&装饰模式




组合模式

问题:当需要管理一些类似对象,且对象间的关系是树型结构时

实现:

组合模式

总结:

优点:

  1. 客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦(混合组件和非混合组件具有相同的父类)
  2. 灵活的增加删除组件

缺点:

  1. 当组件间的关系特殊情况越来越多时(例如组件1不能作为组件2的子类…),这种关系的限制代码将会破坏模式的简洁
  2. 当组件中包含复杂的算法逻辑时,混合结构组件简单的调用,可能需要付出高昂时间和空间的代价。(解决方案:缓存策略)
  3. 当需要保存对象的状态时,对象间树型结构的关系不能轻松保存在关系型数据库,但保存为XML是一个很好的选择

装饰模式

问题:将所有功能建立在继承体系上会导致系统中的类“爆炸式”增多,同时继承树中不同分支的类中的方法会有很多相似的代码,产品了代码重复。如下图:

爆炸式的继承

为了同时需要特性1和2的普通产品A,我们不得不增加一个新的类,这样当特性的组合越来越多时,我们的类库将“爆炸式的增长”,代码越来越能以维护,产品A的特性有时我们需要在运行中决定,这种继承体系的结构将难以适应我们的需求。

实现:

装饰模式

总结:

因为装饰者模式同组合模式具体相似的类结构图,所以它具有跟组合模式相同的优缺点。但是因为模式的应该场景不同,也会有些不同的需要要注意的地方

优点:跟组合模式一样具有不错的灵活性,可以在运行时产生具体功能的对象

缺点:如果被装饰者本身带有许方法特性,装饰者不得不为它的包装对象的public方法加上委托,造成了装饰者同被装饰者的耦合,也可能造成BUG。

大总结:

组合模式一般树型结构的关系,装饰者模式是1-1-1关系,所以组合模式中的混合结构对象中保存者多个子类,而装饰模式的装饰者对象中只保存了一个子类,所以客户段调用代码也不一样。如下:

组合模式调用:

混合结构对象2->ADD(非混合结构对象A)

混合结构对象1->ADD(混合结构对象2);

混合结构对象1->ADD(非混合结构对象B);

混合结构对象1->DISPLAY();

装饰模式:

装饰者C(装饰者B(装饰者A(被装饰者)))->DISPLAY();

这一点点不同的代码结构,产生出两种模式,也是解决两种不同场景下的方案。

谢 懿茂
关于

IT浪潮瞬息万变,争做一名弄潮的程序员! QQ:2646739154

标签: , ,

发表评论