当前位置:编程学习 > JAVA >>

设计模式之组合模式(Composite)(结构型)

1.场景模拟
使用软件模拟大树的根节点和树枝节点和叶子节点
抽象为两类,容器节点和叶子节点

2.不用模式的解决方案

package demo14.composite.example1;  
import java.util.*;  
  
  
/** 
 * 组合对象,可以包含其它组合对象或者叶子对象 
 */  
public class Composite {  
    /** 
     * 用来记录包含的其它组合对象 
     */  
    private Collection<Composite> childComposite = new ArrayList<Composite>();  
    /** 
     * 用来记录包含的其它叶子对象 
     */  
    private Collection<Leaf> childLeaf = new ArrayList<Leaf>();  
    /** 
     * 组合对象的名字 
     */  
    private String name = "";  
    /** 
     * 构造方法,传入组合对象的名字 
     * @param name 组合对象的名字 
     */  
    public Composite(String name){  
        this.name = name;  
    }  
    /** 
     * 向组合对象加入被它包含的其它组合对象 
     * @param c 被它包含的其它组合对象 
     */  
    public void addComposite(Composite c){  
        this.childComposite.add(c);  
    }  
    /** 
     * 向组合对象加入被它包含的叶子对象 
     * @param leaf 被它包含的叶子对象 
     */  
    public void addLeaf(Leaf leaf){  
        this.childLeaf.add(leaf);  
    }  
    /** 
     * 输出组合对象自身的结构 
     * @param preStr 前缀,主要是按照层级拼接的空格,实现向后缩进 
     */  
    public void printStruct(String preStr){  
        //先把自己输出去   
        System.out.println(preStr+"+"+this.name);  
        //然后添加一个空格,表示向后缩进一个空格,输出自己包含的叶子对象   
        preStr+=" ";  
        for(Leaf leaf : childLeaf){  
            leaf.printStruct(preStr);  
        }  
        //输出当前对象的子对象了   
        for(Composite c : childComposite){  
            //递归输出每个子对象   
            c.printStruct(preStr);  
        }  
    }  
}  
***********************************************************************************************  
package demo14.composite.example1;  
/** 
 * 叶子对象 
 */  
public class Leaf {  
    /** 
     * 叶子对象的名字 
     */  
    private String name = "";  
    /** 
     * 构造方法,传入叶子对象的名字 
     * @param name 叶子对象的名字 
     */  
    public Leaf(String name){  
        this.name = name;  
    }  
    /** 
     * 输出叶子对象的结构,叶子对象没有子对象,也就是输出叶子对象的名字 
     * @param preStr 前缀,主要是按照层级拼接的空格,实现向后缩进 
     */  
    public void printStruct(String preStr){  
        System.out.println(preStr+"-"+name);  
    }  
}  
***************************************************************************************************  
package demo14.composite.example1;  
  
  
public class Client {  
    public static void main(String[] args) {  
        // 定义所有的组合对象   
        Composite root = new Composite("服装");  
        Composite c1 = new Composite("男装");  
        Composite c2 = new Composite("女装");  
        // 定义所有的叶子对象   
        Leaf leaf1 = new Leaf("衬衣");  
        Leaf leaf2 = new Leaf("夹克");  
        Leaf leaf3 = new Leaf("裙子");  
        Leaf leaf4 = new Leaf("套装");  
        // 按照树的结构来组合组合对象和叶子对象   
        root.addComposite(c1);  
        root.addComposite(c2);  
  
  
        c1.addLeaf(leaf1);  
        c1.addLeaf(leaf2);  
  
  
        c2.addLeaf(leaf3);  
        c2.addLeaf(leaf4);  
  
  
        // 调用根对象的输出功能来输出整棵树   
        root.printStruct("");  
    }  
}  

 

补充:软件开发 , Java ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,