设计模式之组合模式

一. 前言:

小熙最近看了下组合模式,记录下。在23种设计模式中偏向于结构类型,有时又叫作部分-整体模式,它是一种将对象组合成树状的层次结构的模式,用来表示“部分-整体”的关系,使用户对单个对象和组合对象具有一致的访问性。

二. 过程:

  1. 图解
    组合

  2. 组合模式

    /**
     * 组合模式
     *      适用于遍历树状结构,组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对象,这简化了客户端代码;
     *      但是设计较复杂,客户端需要花更多时间理清类之间的层次关系,不容易限制容器中的构件,不容易用继承的方法来增加构件的新功能;
     *
     * @author chengxi
     * @date 2020/8/25 15:46
     */
    abstract class Node{
        /**
         * 打印名称
         * @return
         */
        public abstract void printName();
    }
    
    class BranchNode extends Node {
        List<Node> nodeList = new ArrayList<>();
    
        String name;
    
        public BranchNode(String name) {
            this.name = name;
        }
    
        @Override
        public void printName() {
            System.out.println(name);
        }
    
        public void addNode(Node node){
            nodeList.add(node);
        }
    }
    
    class LeafNode extends Node {
    
        String name;
    
        public LeafNode(String name) {
            this.name = name;
        }
    
        @Override
        public void printName() {
            System.out.println(name);
        }
    }
    
    class TestMain {
        public static void main(String[] args) {
            BranchNode branchNodeRoot = new BranchNode("主节点");
            BranchNode branchNodeOne = new BranchNode("第一个分支");
            BranchNode branchNodeTWO = new BranchNode("第二个分支");
            BranchNode branchNodeFour = new BranchNode("第三个分支");
    
            LeafNode leafNodeOne = new LeafNode("第一片叶子");
            LeafNode leafNodeTwo = new LeafNode("第二片叶子");
            LeafNode leafNodeThree = new LeafNode("第三片叶子");
            LeafNode leafNodeFour = new LeafNode("第四片叶子");
    
            branchNodeRoot.addNode(branchNodeOne);
            branchNodeRoot.addNode(branchNodeTWO);
            branchNodeTWO.addNode(branchNodeFour);
    
            branchNodeOne.addNode(leafNodeOne);
            branchNodeOne.addNode(leafNodeTwo);
            branchNodeFour.addNode(leafNodeThree);
            branchNodeFour.addNode(leafNodeFour);
    
            // 打印树状结构图
            printTree(branchNodeRoot, 0);
        }
    
        public static void printTree(Node node, int depth){
            for (int i = 0; i < depth; i++) {
                System.out.print("--");
            }
            node.printName();
    
            if (node instanceof BranchNode) {
                for (Node node1 : ((BranchNode) node).nodeList) {
                    printTree(node1, depth + 1);
                }
            }
        }
    
    }
    

三. 后语:

组合模式常用于和树状结构有关的场景中,其他场景使用的还是比较少的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值