06设计模式之组合模式

用处:树结构,...

先上类图


组合模式.jpg

案例代码

先定义Node接口

package com.wwj.compositemode;

public interface Node {
    abstract public void p();
}

定义叶子节点

package com.wwj.compositemode;

/***
 * 叶子节点,无下一层,包含具体的内容
 */
public class LeafNode implements Node {
    private String content;

    public LeafNode(String content){
        this.content=content;
    }

    @Override
    public void p() {
        System.out.println(content);
    }
}

定义分支节点

package com.wwj.compositemode;

import java.util.ArrayList;
import java.util.List;

/**
 * 分支节点,包含多个Node(可能是叶子节点也可能是分支节点)
 */
public class BranchNode implements Node {
    private String name;
    private List<Node> nodes = new ArrayList<>();

    public BranchNode(String name){
        this.name = name;
    }
    @Override
    public void p() {
        System.out.println(name);
    }

    public void addNodes(Node node){
        this.nodes.add(node);
    }

    public List<Node> getNodes(){
        return this.nodes;
    }

    public static void tree(Node node,int depth){
        for (int i = 0; i <depth ; i++) {
            System.out.print("--");
        }
        node.p();
        if (node instanceof BranchNode){
            BranchNode branchNode = (BranchNode)node;
            for(Node n:branchNode.getNodes()){
                tree(n,depth+1);
            }
        }
    }
}

具体应用

package com.wwj.compositemode;

public class main {
    public static void main(String[] args) {
        //最顶级菜单
        BranchNode root = new BranchNode("root");

        //第二级菜单
        BranchNode menuOne = new BranchNode("menuOne");
        BranchNode menuTwo = new BranchNode("menuTwo");
        BranchNode menuThree = new BranchNode("menuThree");

        //第三集菜单(最后一级菜单)
        LeafNode ln1 = new LeafNode("ln1");
        LeafNode ln2 = new LeafNode("ln2");
        LeafNode ln3 = new LeafNode("ln3");
        LeafNode ln4 = new LeafNode("ln4");

        //添加一级菜单
        root.addNodes(menuOne);
        root.addNodes(menuTwo);
        root.addNodes(menuThree);

        //添加二级菜单
        menuOne.addNodes(ln1);
        menuOne.addNodes(ln2);
        menuTwo.addNodes(ln3);
        menuTwo.addNodes(ln4);

        //打印所有节点
        BranchNode.tree(root,0);
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容