首页 > 其他分享 >设计模式学习(十一):组合模式

设计模式学习(十一):组合模式

时间:2022-11-11 09:24:37浏览次数:65  
标签:Node 十一 组合 content 设计模式 root public BranchNode

设计模式学习(十一):组合模式

作者:Grey

原文地址:

博客园:设计模式学习(十一):组合模式

CSDN:设计模式学习(十一):组合模式

组合模式

组合模式是一种结构型模式。

组合模式中,最常用的一个用法就是目录层级的遍历,话不多说,直接上代码,主方法中

public class Main {
    public static void main(String[] args) {
        BranchNode root = new BranchNode("root");
        BranchNode branch1 = new BranchNode("branch1");
        BranchNode branch2 = new BranchNode("branch2");
        branch1.addNode(new LeafNode("leaf1"));
        root.addNode(branch1);
        root.addNode(branch2);
        tree(root, 0);
    }
}

其中, BranchNode 为分支节点, LeafNode 是叶子节点 达到的效果就是打印如下的形式

root
--branch1
----leaf1
--branch2

递归方法

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

其中 BranchNode 和 LeafNode 都实现了 Node 接口,Node 接口(也可以为定义抽象类)仅提供了一个属性( content 属性,用于标识节点内容)和一个打印方法:

public abstract class Node {
    protected String content;

    protected abstract void print();
}

BranchNode 下可以包含多个 Node,因为一个分支下面可以有多个分支(这个分支可以是任意的 Node 子类)

public class BranchNode extends Node {
    private List<Node> nodes = new ArrayList<>();

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

    @Override
    public void print() {
        System.out.println(content);
    }    // get..set方法略 
}

组合模式的 UML 图如下:

image

组合模式的应用

MyBatis解析各种 Mapping 文件中的 SQL 语句时,设计了一个非常关键的类叫作 SqlNode,XML 中的每一个 Node 都会被解析为一个 SqlNode 对象,最后把所有 SqlNode 都拼装到一起,就成为一条完整的 SQL 语句。

UML 和 代码

UML 图

代码

更多

设计模式学习专栏

参考资料

标签:Node,十一,组合,content,设计模式,root,public,BranchNode
From: https://www.cnblogs.com/greyzeng/p/16879520.html

相关文章

  • 初识设计模式 - 解释器模式
    简介在某些情况下,为了更好地描述某一些特定类型的问题,我们可以创建一种新的语言,这种语言拥有自己的表达式和结构,即文法规则。解释器设计模式(InterpreterDesignPattern)......
  • Java组合异步编程(2)
    您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~ 多数码农在开发的时候,要么处理同步应用,要么处理异步。但是如果能学会使用CompletableFuture,就会具备一种神奇的能力:将同......
  • 设计模式学习(十):门面模式
    设计模式学习(十):门面模式作者:Grey原文地址:博客园:设计模式学习(十):门面模式CSDN:设计模式学习(十):门面模式门面模式门面模式是一种结构型模式。门面模式为子系统提供一组统......
  • OI loves Math(三)——组合数
    又来了(喜)这次我们聊组合数,也就是$C_n^m$。。。。。。何为组合数没人不知道吧。。。。。。组合数就是问从$n$项里选$m$项有多少种选法,记作$C_n^m$或$......
  • 浅谈PHP设计模式的模板方法模式
    简介:模板方法模式,是行为型的设计模式。定义一个操作中的算法的骨架,而将一些步骤延迟到子类当中,使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。通......
  • JS中的Map形式(十一)
    东家蝴蝶西家飞,白骑少年今日归。愿,所有迷茫的人,都不再迷茫的,愿,所有努力工作的人,都可以得到应有的回报,愿,所有的人,都可以找到回家的方向,愿,再无苦痛,再无离别。上一章简单介绍......
  • 设计模式学习(九):装饰器模式
    设计模式学习(九):装饰器模式作者:Grey原文地址:博客园:设计模式学习(九):装饰器模式CSDN:设计模式学习(九):装饰器模式装饰器模式装饰器模式是一种结构型模式。顾名思义,就是对某......
  • 浅谈PHP设计模式的原型模式
    简介:原型模式,属于创建型模式的一种。主要针对对象进行克隆,把被克隆的对象称之为原型,原型模式称之为克隆模式也许更为贴切。用原型实例指定创建对象的种类,并且通过拷贝这......
  • 线性组合和线性相关
    线性组合和线性相关\(author:Sheldon\)原视频搓这里线性组合与线性相关(侵删)线性组合:给定向量组\(A=\{a_1,a_2,...,a_m\}\)和向量\(b\),如果存在一组实数\(k_1,k_2,........
  • 题解 P3974【[TJOI2015]组合数学】
    postedon2022-10-2814:11:41|under题解|sourceproblem给出一个网格图,其中某些格子有财宝,每次从左上角出发,只能向下或右走。问至少走多少次才能将财宝捡完。此对......