• 设计模式之组合模式(composize)


    写在前面

    什么是组合模式,笼统来说,用来处理树形结构的模式就是组合模式

    举几个树形结构的例子:

    • 文件目录结构

    每一个文件和文件夹就是树的结点,具体的一个文件就是树的叶子节点

    • 前段时间一个教育行业的同事遇到的一个问题

    这也是一个树形结构,不过分类更加复杂一些,不像文件目录结构那样,只有两种类型:文件夹和文件

    代码分析

    这里以文件目录结构为例

    1. 抽象出树形结构的祖宗Node
    package com.zl.composize;
    
    public abstract class Node {
        public abstract void print();
        public abstract void add(Node node);
    }

      2. 叶子节点,代表文件

    package com.zl.composize;
    
    public class LeafNode extends Node{
        
        String content;
        public LeafNode(String content) {
            this.content = content;
        }
        
        @Override
        public void print() {
            System.out.println(content);
        }
    
        @Override
        public void add(Node node) {
            System.out.println("这是叶子结点,不能添加元素");
        }
    }

      

      3. 分支节点,代表文件夹(注意,当文件夹为空时,它就是一个叶子节点)

    package com.zl.composize;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class BranchNode extends Node{
        String name;
        public List<Node> nodes = new ArrayList<>();
        public BranchNode(String name) {
            this.name = name;
        }
        @Override
        public void print() {
            System.out.println(name);
        }
        @Override
        public void add(Node node) {
            nodes.add(node);
        }
    }

      4. 测试类Main

    package com.zl.composize;
    
    public class Main {
        public static void main(String[] args) {
            BranchNode root = new BranchNode("root");
            BranchNode branchNode1 = new BranchNode("1-1");
            BranchNode branchNode2 = new BranchNode("2-1");
            LeafNode leafNode1 = new LeafNode("1-1-1");
            LeafNode leafNode2 = new LeafNode("1-1-2");
            BranchNode branchNode3 = new BranchNode("2-1-1");
            LeafNode leafNode3 = new LeafNode("2-1-1-1");
            LeafNode leafNode4 = new LeafNode("2-1-1-2");
    
            root.add(branchNode1);
            root.add(branchNode2);
            branchNode1.add(leafNode1);
            branchNode1.add(leafNode2);
            branchNode2.add(branchNode3);
            branchNode3.add(leafNode3);
            branchNode3.add(leafNode4);
    
            tree(root, 0);
        }
    
        public static void tree(Node node, int depth) {
            for (int i = 0; i < depth; i++) {
                System.out.print("--");
            }
            node.print();
            if (node instanceof BranchNode) {
                BranchNode branchNode = (BranchNode)node;
                for (Node branchNode1: branchNode.nodes)
                    tree(branchNode1, depth+1);
            }
        }
    }

    为了更清晰的看出目录结构,递归输出时,我做了一些处理。输出结果如下:

  • 相关阅读:
    正则表达式工具RegexBuddy使用教程(原创自Zjmainstay)
    基于nodejs实现js后端化处理
    深入正则表达式应用
    如何利用火狐控制台下载网页图片
    Ajax实现提交表单时验证码自动验证(原创自Zjmainstay)
    PHP cURL应用实现模拟登录与采集使用方法详解
    程序猿教你怎样记密码
    我眼里的正则表达式(入门)
    博客园文章markdown实现
    jQuery实现菜单点击隐藏(上下左右)
  • 原文地址:https://www.cnblogs.com/zhulei2/p/13734136.html
Copyright © 2020-2023  润新知