• 在线客服

  • 扫描二维码
    下载博学谷APP

  • 扫描二维码
    关注博学谷微信公众号

  • 意见反馈

原创 组合模式深度解析

发布时间:2019-07-29 17:51:14 浏览 7411 来源:博学谷资讯 作者:照照

    我们常常谈的组合模式,其实就是允许你将对象组合成树形结构来表现 "整体/部分" 层次结构。本文将从组合模式的定义、包含角色、通用源代码以及优缺点几方面来详细分析,帮助大家深刻了解Java设计模式之组合模式。

     

    组合模式解析

     

    一、组合模式定义

     

    是一种常见的设计模式(但我感觉有点复杂)也叫合成模式,有时又叫做部分-整体模式,主要是用来描述部分与整体的关系。组合模式就是将部分组装成整体。将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。

     

    二、组合模式的包含角色:

     

    (1)Component 抽象构件角色

     

    定义参加组合对象的共有方法和属性,可以定义一些默认的行为或属性。

     

    (2)Leaf 叶子构件

     

    叶子对象,其下再也没有其他的分支,也就是遍历的最小单位。

     

    (3)Composite 树枝构件

     

    树枝对象,它的作用是组合树枝节点和叶子节点形成一个树形结构。

     

    三、通用源代码:

     

    (1)抽象构件

     

    public abstract class Component {

     

    //个体和整体都具有的共享

     

    public void doSomething(){

     

    //编写业务逻辑

     

    }

     

    }

     

    (2)树枝构件

     

    public class Composite extends Component {

     

    //构件容器

     

    private ArrayList<Component> componentArrayList = new ArrayList<Component>()

     

    //增加一个叶子构件或树枝构件

     

    public void add(Component component){

     

    this.componentArrayList.add(component);

     

    }

     

    //删除一个叶子构件或树枝构件

     

    public void remove(Component component){

     

    this.componentArrayList.remove(component);

     

    }

     

    //获得分支下的所有叶子构件和树枝构件

     

    public ArrayList<Component> getChildren(){

     

    return this.componentArrayList;

     

    }

     

    }

     

    树叶节点是没有子下级对象的对象,定义参加组合的原始对象行为。

     

    (3)树叶构件

     

    public class Leaf extends Component {

     

    /*

     

    *

     

    可以覆写父类方法

     

    * public void doSomething(){

     

    *

     

    * }

     

    */

     

    }

     

    测试类负责树状结构的建立,并可以通过递归方式遍历整个树。

     

    public class Client {

     

    public static void main(String[] args) {

     

    //创建一个根节点

     

    Composite root = new Composite();

     

    root.doSomething();

     

    //创建一个树枝构件

     

    Composite branch = new Composite();

     

    //创建一个叶子节点

     

    Leaf leaf = new Leaf();

     

    //建立整体

     

    root.add(branch);

     

    branch.add(leaf);

     

    }

     

    //通过递归遍历树

     

    public static void display(Composite root){

     

    for(Component c:root.getChildren()){

     

    if(c instanceof Leaf){ //叶子节点

     

    c.doSomething();

     

    }else{ //树枝节点

     

    display((Composite)c);

     

    }

     

    }

     

    }

     

    }

     

    四、组合模式优点:

     

    (1)高层模块调用简单

     

    一棵树形机构中的所有节点都是Component,局部和整体对调用者来说没有任何区别,也就是说,高层模块不必关心自己处理的是单个对象还是整个组合结构,简化了高层模块的代码。

     

    (2)节点自由增加

     

    使用了组合模式后,我们可以看看,如果想增加一个树枝节点、树叶节点是不是都很容易,只要找到它的父节点就成,非常容易扩展,符合开闭原则,对以后的维护非常有利。

     

    五、组合模式的缺点:

     

    组合模式有一个非常明显的缺点,看到我们在场景类中的定义,提到树叶和树枝使用时的定义了吗?直接使用了实现类!这在面向接口编程上是很不恰当的,与依赖倒置原则冲突,读者在使用的时候要考虑清楚,它限制了你接口的影响范围。

     

    使用场景:

     

    (1)维护和展示部分-整体关系的场景,如树形菜单、文件和文件夹管理。

     

    (2)从一个整体中能够独立出部分模块或功能的场景。

     

    简而言之,组合模式能够充分体现局部和整体的关系,它既有优点又有缺点,但整体上来说还是很方便实用的。以上关于组合模式的深度解析,大家都弄懂了吗?

    申请免费试学名额    

在职想转行提升,担心学不会?根据个人情况规划学习路线,闯关式自适应学习模式保证学习效果
讲师一对一辅导,在线答疑解惑,指导就业!

上一篇: Java课程设计题目有哪些?Java课程设计题目汇总 下一篇: 折半插入排序讲解 干货教程

相关推荐 更多

热门文章

  • 前端是什么
  • 前端开发的工作职责
  • 前端开发需要会什么?先掌握这三大核心关键技术
  • 前端开发的工作方向有哪些?
  • 简历加分-4步写出HR想要的简历
  • 程序员如何突击面试?两大招带你拿下面试官
  • 程序员面试技巧
  • 架构师的厉害之处竟然是这……
  • 架构师书籍推荐
  • 懂了这些,才能成为架构师
  • 查看更多

扫描二维码,了解更多信息

博学谷二维码