• 23种设计模式之组合模式


    组合模式的定义

    定义: 将对象组合成树形结构以表示 "部分-整体" 的层次结构,使得用户对单个对象和组合对象的使用具有一致性.

    通俗的说, 就是实现了树形结构

    通用类图如下:

    23种设计模式之组合模式

     

    其中的三个角色如下:

    1. Component 抽象构件角色: 定义参加组合对象的共有方法和属性, 可以定义一些默认的行为或属性
    2. Aggregate 树枝构件: 组合树枝节点和叶子节点形成一个树形结构
    3. Leaf 叶子构件: 其下再没有其的分支, 是遍历的最小单位

    抽象构件角色代码:

    23种设计模式之组合模式

     

    树枝构件代码:

    23种设计模式之组合模式

     

    叶子构件代码:

    23种设计模式之组合模式

     

    场景类代码:

    23种设计模式之组合模式

     

    组合模式的应用

    组合模式的优点:

    1. 高层模块调用简单. 一棵树形机构中所有的节点都是 Component, 局部和整体对调用者来说没有区别, 高层模块不必关心自己处理的是单个对象还是组合结构, 简化了高层模块的代码
    2. 节点自由增加. 如果想增加一个树枝节点、树叶节点, 只要找到它的父节点就可以, 非常容易扩展,符合开闭原则,对以后的维护非常有利

    组合模式的缺点:

    我们在使用的时候, 树叶和树枝的定义直接使用了实现类, 这在面向接口编程上是很不恰当的, 与依赖倒置原则冲突, 限制了接口的影响范围

    组合模式的使用场景:

    1. 维护和展示部分-整体关系的场景, 如树形菜单、文件和文件夹管理
    2. 从一个整体中能够独立出部分模块或功能的场景

    只要是树形结构, 就要考虑使用组合模式, 只要是要体现局部和整体的关系的时候,而且这种关系还可能比较深, 应该考虑组合模式

    组合模式的扩展

    1.真实的组合模式

    在上边的例子中, Clien 中进行了树的组装, 而在实际项目中, 数据通常在数据库中, 我们直接从数据库将数据读取放到树上就可以了

    2.透明的组合模式

    组合模式有两种实现: 透明模式和安全模式. 上面的实现就是安全模式, 透明模式的类图如下:

    23种设计模式之组合模式

     

    透明模式就是把用来组合使用的方法放到抽象类中, 通过判断getChild() 的返回值确定是叶子节点还是树枝节点, 在 Leaf 中实现 add等方法要抛出异常, 如果处理不当, 会在运行期出现问题

    在透明模式下, 遍历整个树形结构是比较容易的, 不用进行强制类型转换.

    透明模式的好处就是它基本遵循了依赖倒置原则, 方便系统扩展

    3.组合模式的遍历

    有的时候不光要从上向下遍历, 还要从下往上遍历, 也就是通过子节点要找到他的父节点, 这时就要在抽象构件角色中添加 getParent 方法, 也就是在每个节点都增加一个父节点对象

  • 相关阅读:
    nginx升级总结,漏洞升级
    【BUG解决】在git上pull时提示You have not concluded your merge. (MERGE_HEAD exists)
    如何自签名把http网站变成https网站(https自签名方法)
    ifly
    Shell排序和二叉树排序
    C/C++复习笔记(2)
    C/C++复习笔记(1)
    C语言字符串操作
    python+flask
    C语言的一点复习
  • 原文地址:https://www.cnblogs.com/hujingnb/p/10171588.html
Copyright © 2020-2023  润新知