组合模式——java设计模式(十)

简介

组合模式(Composite Pattern):组合多个对象形成树形结构,以表示具有整体部分关系的层次结构,使客户端可以统一的对待单个对象和组合对象。

  • 需要客户端一致的处理叶子构件和容器构件,可以定义抽象构件,代表叶子构件和容器构件,并在容器构件中关联抽象构件,形成树形结构。
  • 组合模式又称部分-整体模式

结构和实现

  • 角色包括:
    • 抽象构件:叶子构件和容器构件继承的抽象类,包含叶子和容器的共有行为的声明,如业务方法,也可能包含管理叶子的方法。
    • 叶子构件:树的叶结点,实现抽象构件的业务方法,对于容器特有的管理子结点的方法,可以使用空方法或者抛出异常处理。
    • 容器构件:树的非叶结点,管理包含的子结点,业务方法可以递归调用子结点的业务方法。
  • 根据透明性和安全性,组合模式分为透明组合模式安全组合模式

透明组合模式

  • 抽象构件声明了管理叶结点的方法和业务方法,客户端可以一致对待所有对象。但是叶结点不可能管理子结点,如果管理方法处理不好会出错。
    180507.transp.png

安全组合模式

  • 抽象构件中只声明了业务方法,叶结点没有管理子结点的方法,是安全的。但是叶子构件和容器构件不一致,客户端需要区别对待。
    180507.safe.png

实例

  • 开发杀毒软件,既可以对文件夹杀毒,也可以对指定文件杀毒。
    180507.virus.png

优缺点和适用环境

  • 优点:
    • 清楚的定义树形的复杂对象
    • 忽略层次差异。客户端可以不关心是组合结构和是单个对象,对整个层次控制。
    • 方便增加构件。无论容器构件和是叶子构架,增加无需修改源码,符合开闭原则。
  • 缺点:
    • 难以对容器中的构件类型限制。无法限定某个容器中只包含容器构件等,需要运行时类型检查。
  • 适用环境:
    • 客户端需要忽略整体和部分的差异。
    • 需要处理树形结构。
    • 系统中可以分离容器和叶子对象,且类型不确定。

jdk中的应用

  • org.w3c.dom中的Node,可形成树形结构。
    180509.NodeImpl.png

猜你喜欢

转载自blog.csdn.net/qq_40369829/article/details/80265883
今日推荐