Java设计模式概述之结构型模式(组合模式)

四、组合模式(Composite)

组合模式相对不好阐述。引用大话设计模式的片段:“当发现需求中是体现部分与整体层次结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑组合模式了。”

组合模式与树形结构程序设计是密不可分的。组合模式很好的体现了“整体——部分”的关系。

这里写图片描述

下面给大家一段自己写的有关组合模式的代码:

import java.util.Enumeration;
import java.util.Vector;

/**
 * @author Hanlin Wang
 */

public class CompositeMode {
    public static void main(String[] args) {
        TreeNode A = new TreeNode("A");
        TreeNode B = new TreeNode("B");
        TreeNode C = new TreeNode("C");
        TreeNode D = new TreeNode("D");
        TreeNode E = new TreeNode("E");
        TreeNode F = new TreeNode("F");
        TreeNode G = new TreeNode("G");
        TreeNode H = new TreeNode("H");
        TreeNode I = new TreeNode("I");
        TreeNode J = new TreeNode("J");
        TreeNode K = new TreeNode("K");
        TreeNode L = new TreeNode("L");
        TreeNode M = new TreeNode("M");
        TreeNode N = new TreeNode("N");
        TreeNode O = new TreeNode("O");
        A.addChild(B);
        A.addChild(C);
        B.addChild(D);
        B.addChild(E);
        C.addChild(F);
        C.addChild(G);
        D.addChild(H);
        D.addChild(I);
        E.addChild(J);
        E.addChild(K);
        F.addChild(L);
        F.addChild(M);
        G.addChild(N);
        G.addChild(O);
        TreeNode.showTreeNodes(A);

        /*
         * 运行结果:
         * 
         * A节点的子元素: B  C  
         * B节点的子元素: D  E  
         * D节点的子元素: H  I  
         * E节点的子元素: J  K  
         * C节点的子元素: F  G  
         * F节点的子元素: L  M  
         * G节点的子元素: N  O  
         */
    }
}

//定义节点类
class TreeNode{
    private String nodeName;
    private Vector<TreeNode> children = new Vector<TreeNode>();
    public TreeNode(String nodeName){
        this.nodeName = nodeName;
    }
    public String getNodeName() {
        return nodeName;
    }
    public void setNodeName(String nodeName) {
        this.nodeName = nodeName;
    }
    public Enumeration<TreeNode> getChildren() {
        return children.elements();
    }
    public void addChild(TreeNode node) {
        children.add(node);
    }
    public static void showTreeNodes(TreeNode node){
        Enumeration<TreeNode> children = node.getChildren();
        System.out.print(node.getNodeName()+"节点的子元素: ");
        while (children.hasMoreElements()) {
            TreeNode subNode = children.nextElement();
            System.out.print(subNode.getNodeName()+"  ");
        }
        Enumeration<TreeNode> children2 = node.getChildren();
        while (children2.hasMoreElements()) {
            TreeNode subNode = children2.nextElement();
            if (subNode.getChildren().hasMoreElements()) {
                System.out.println();
                showTreeNodes(subNode);
            }
        }
    }
}

TreeNode是基本的节点类,里面定义了一个Vector类型的children成员变量和一系列操纵叶子节点的方法。最后还定义了一个showTreeNodes方法用于打印本节点及本节点以下的所有的叶子节点。

注意,showTreeNodes方法中会判断下一个叶子节点内的节点是否还有子节点,如果有,对showTreeNodes方法本身进行递归调用。

posted @ 2017-02-06 14:42  晚樨  阅读(107)  评论(0编辑  收藏  举报