`

设计模式(14)- 组合模式

阅读更多

组合模式

1.定义

      将对象组合成树形结构,以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

 

2.示例代码

     商品分类树形结构,使得类别和叶子节点通过统一的组件对象访问。

    

/*抽象组件对象,为组合中的对象声明接口,实现接口的缺省行为*/
public abstract class Component{
   //输出组件自身的名称
   public abstract void printStruct(String preStr);
   /*向组合对象中添加组件对象*/
   public void addChild(Component child){
      throw new UnsupportedOperationException("对象不支持这个方法");
   }
   /*移除组件对象*/
   public void removeChild(Component child){
      throw new UnsupportedOperationException("对象不支持这个方法");
   }
   /*根据索引获取组件对象*/
   public Component getChildren(int index){
      throw new UnsupportedOperationException("对象不支持这个方法");
   }
}

   

/*叶子对象实现*/
public class Leaf extends Component{
   //叶子对象名称
   private String name = "";
   public Leaf(String name){
       this.name = name;
   }
   //输出叶子对象结构
   public void printStruct(String preStr){
      System.out.println(preStr + "-" + name);
   }
}

/*组合对象实现,可以包含其他组合对象和叶子节点*/
public class Composite extends Component{
   //用来存储组合对象包含的子组件对象
   private List<Component> childComponents = null;
   //组合对象名字
   private String name = "";
   public Composite(String name){
       this.name = name;
   }
   public void addChild(Component child){
       if(childComponents == null){
           childComponents  = new ArrayList<Component>();
       }
       childComponents.add(child);
   }
   public void printStruct(String preStr){
        //先把自己输出去
        System.out.println(preStr+ "-" + name);
        //如果还包含自组件对象,那么就输出子组件对象
        if(this.childComponents != null){
            //添加空格缩进
            preStr += " ";
            //输出子组件对象
            for(Component c : childComponents){
                c.printStruct(preStr);
            }
        }
   }
}

   

/*客户端操作不需要区分叶子节点和组合对象*/
public class Client{
   public static void main(String args[]){
        //定义所有组合对象
        Component root = new Component("服装");
        Component c1 = new Component("男装");
        Component c2 = new Component("女装");
        //定义所有叶子对象
        Component leaf1 = new Leaf("衬衣");
        Component leaf2 = new Leaf("夹克");
        Component leaf3 = new Leaf("裙子");
        Component leaf4 = new Leaf("套装"); 
        //按照结构组合对象和叶子对象
        root.addChild(c1);
        root.addChild(c2);
        c1.addChild(leaf1);
        c1.addChild(leaf2);
        c2.addChild(leaf3);
        c2.addChild(leaf4);
        //调用根对象输出整棵树
        root.printStruct("");
   }
}

 

3.实际应用

        组合模式的目的是让客户端不在区分操作的是组合对象还是叶子对象,而是以统一的方式来操作,实现这个目标的关键之处,是设计一个抽象的组件类,让它可以代表组合对象和叶子对象,这也意味着,所有可以使用对象树来描述或者操作的功能,都可以考虑使用组合模式,比如读取xml文件,或是对语句进行语法解析等。

组合模式的本质:统一叶子对象和组合对象
分享到:
评论

相关推荐

    设计模式精解-GoF-23种设计模式解析--附C++源代码

    - 组合模式(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构。 - 装饰模式(Decorator):动态地给一个对象添加一些额外的职责。 - 享元模式(Flyweight):使用共享对象,有效地支持大量细...

    c++设计模式-结构型模式-组合模式

    c++设计模式-结构型模式-组合模式;qt工程;c++简单源码; 组合(Composite Pattern)模式的定义:有时又叫作整体-部分(Part-Whole)模式,它是一种将对象组合成树状的层次结构的模式,用来表示“整体-部分”的关系...

    C++设计模式--基于Qt4开源跨平台开发框架

    《C++设计模式--基于Qt4开源跨平台开发框架》一书主要探讨了如何在C++编程中利用设计模式,并结合Qt4框架进行高效的跨平台应用开发。设计模式是软件工程中的重要概念,它们是经过时间和实践验证的解决特定问题的模板...

    设计模式--组合模式java例子

    组合模式是一种结构型设计模式,它允许我们使用树形结构来表示部分-整体关系,使得我们能够像处理单个对象一样处理整个集合。在Java中,这种模式的应用可以帮助我们简化对复杂对象层次结构的操作,同时保持接口的...

    设计模式课件大全

    PPT内容包括:内附代码,实例,方便理解。...设计模式14-中介者模式、备忘录模式 设计模式15-观察者模式、状态模式 设计模式16-策略模式、模板方法、访问者 此PPT实例便于理解,对于深入理解OO思想有很大帮助。

    JAVA-设计模式-结构型模式-组合模式

    JAVA-设计模式-结构型模式-组合模式

    java常用设计模式-组合模式

    java常用设计模式-组合模式 组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构以表示“部分-整体”的层次结构。这种模式使得客户端可以统一对待单个对象和对象组合。在组合模式中...

    设计模式精解-GoF 23种设计模式解析附C++.pdf

    ### 设计模式精解——GoF 23种设计模式解析及C++实现 #### 0. 引言 设计模式作为面向对象编程的核心组成部分,是软件开发者在长期实践中总结出来的最佳实践。通过深入理解这些设计模式,我们可以更好地进行面向...

    java设计模式---诙谐易懂版

    根据给定文件内容,以下是关于Java设计模式的知识点说明: 1. 策略模式(Strategy Pattern)是一种行为设计模式,允许在运行时选择算法的行为。策略模式的意图是定义一系列算法,将每个算法封装起来,并使它们可以...

    设计模式精解-GoF23种设计模式解析附C++实现源码

    - 组合模式(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。 - 装饰器模式(Decorator):动态地给一个对象添加一些额外的职责,可以独立于...

    设计模式精解-GoF 23种设计模式解析附C++实现源码.pdf

    ### 设计模式精解——GoF 23种设计模式解析及C++实现源码 #### 0. 引言 设计模式是软件工程领域的一个重要概念,它提供了一种解决常见问题的方法论。GoF(Gang of Four)所提出的23种设计模式被视为面向对象设计的...

    设计模式之-----组合模式 java

    组合模式是一种结构型设计模式,它允许我们使用树形结构来表示部分与整体的关系,使得我们能够以统一的方式来处理单个对象和对象的组合。在Java中,组合模式的应用可以帮助我们构建灵活、易于维护的代码。 首先,...

    设计模式-组合实体

    在众多设计模式中,组合实体(Composite)模式是一种结构型模式,它允许我们以树形结构来表示部分与整体的关系,使得用户可以一致地处理单个对象和对象组合。在iOS开发中,组合实体模式尤其有用,因为它简化了复杂...

    Java设计模式----通俗易懂版

    这个资源"Java设计模式----通俗易懂版"显然是一个专门针对初学者或需要深入理解设计模式的开发者编写的指南。作者以形象生动的例子解释了23种经典的Java设计模式,使得复杂的概念变得更加易于理解。 首先,我们要...

    设计模式-组合模式

    组合模式是一种软件设计模式,属于结构型模式,它允许我们以树形结构来表示部分与整体的关系,使得我们可以像处理单个对象一样处理整个集合。在iOS开发中,这种模式非常有用,特别是在处理数据结构或者UI组件时,...

    设计模式精解-GoF 23种设计模式解析附C++实现源码 完整版

    《设计模式精解-GoF 23种设计模式解析附C++实现源码 完整版》是一份深入探讨软件工程中经典设计模式的重要资料,涵盖了面向对象编程中的核心设计原则和实践。这份资源主要关注GoF(Gang of Four,即《设计模式:可...

    设计模式精解-GoF 23种设计模式

    10. **组合模式**:允许你将对象组合成树形结构来表现“整体/部分”层次结构,同时能够像处理单个对象一样处理整个组合。 11. **享元模式**:运用共享技术有效地支持大量细粒度的对象,减少内存占用。 12. **外观...

    设计模式实验报告-组合模式.docx

    ### 设计模式实验报告——组合模式 #### 实验目的与背景 本次实验旨在通过实践学习设计模式中的组合模式,理解其工作原理及应用场景。组合模式(Composite Pattern)是一种结构型设计模式,它允许用户将对象组合成...

Global site tag (gtag.js) - Google Analytics