`

设计模式(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文件,或是对语句进行语法解析等。

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

相关推荐

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

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

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

    自己最近才写的一个设计模式----组合模式小例子,请大家评价

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

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

    设计模式课件大全

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

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

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

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

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

    设计模式专题之(九)组合模式---设计模式组合模式示例代码(python--c++)

    设计模式专题之(九)组合模式---设计模式组合模式示例代码(python--c++)

    设计模式-组合模式(讲解及其实现代码)

    设计模式-组合模式(讲解及其实现代码)

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

    设计模式实验报告

    设计模式-组合模式

    ios平台中通过最简单的代码讲解组合模式,可在博客http://blog.sina.com.cn/s/blog_161d504630102wxis.html中查看简单解释

    设计模式-组合实体

    ios平台中通过最简单的代码讲解组合实体模式,可在博客http://blog.sina.com.cn/s/blog_161d504630102wxis.html中查看简单解释

    设计模式--C++

    2.2.3 组合模式 272.3 格式化 27 2.3.1 封装格式化算法 27 2.3.2 Compositor 和 Composition 27 2.3.3 策略模式 29 2.4 修饰用户界面 29 2.4.1 透明围栏 29 2.4.2 Monoglyph 30 2.4.3 Decorator 模式 32 2.5 支持...

    java设计模式-组合模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段...

    设计模式_组合模式.zip

    这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。 这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。 我们通过下面的实例来演示组合模式的用法。实例演示了一个组织中员工的...

    组合模式-空军指挥系统.zip

    本资源包含一个由Java设计模式中的“组合模式”实现的“空军指挥系统”的全部源代码。注意:本资源含有的代码量比较大,对于急需“项目实战”的朋友很有帮助!需要的朋友可以下载哦!!!!!!!!!!

    设计模式-C++

    结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、...

    JAVA设计模式例程-装饰模式

    JAVA设计模式例程-装饰模式-的例程,看完以后基本上能对JAVA上实现装饰模式能有所了解,个人认为常各种模式并不是为了死套各种模式,而应该是灵活的在项目中结合实际情况而用各种模式的组合应用,呵呵!但前提是得对...

    设计模式组合模式示

    设计模式组合模式---设计模式组合模式示例代码(python--c++)

    设计模式之组合模式(Composite Pattern)

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

    自定义控件 - 设计模式 - 良好设计 - ViewPager

    自定义控件 大量 使用 设计模式原则:组合、委托

Global site tag (gtag.js) - Google Analytics