软件设计模式白话文系列(十二)组合模式

IT技术2年前 (2022)发布 IT大王
0

1、模式描述

组合模式属于结构型模式,把多个对象组成树状结构来表示局部与整体,这样用户可以以相同的方式对待单个对象和组合对象。需要注意的是这里的组合和之前系列中,我们说的组合关系(可以将已有对象纳入新对象中,使之成为新对象的一部分,新对象可以调用已有对象的功能)是两个完全不同的概念哈。

2、模式结构

  • 抽象节点类:树枝节点类和叶子节点类的父类,定义它们的行为规范和共有属性。
  • 树枝节点类:存在下级节点,需要储存叶子节点类的集合。拥有一个或者多个抽象节点对象
  • 叶子节点类:没有下级节点,组合模式最下最小单位。

3、实现逻辑

抽象出共性接口,树枝节点类和叶子节点类同时实现接口,树枝节点类引用接口集合对象,叶子节点引用上级树枝节点对象。

4、实战代码

我们知道文件系统就是一个树状结构,文件夹下面会有文件夹或者文件。在这里文件夹就是树枝节点类,文件就是叶子节点类

/**
 * 抽象节点类
 *
 * @author Eajur.Wen
 * @version 1.0
 * @date 2022-11-16 00:02:58
 */
public interface Node {
    String getPath();
    void print();
}
/**
 * 树枝节点类
 *
 * @author Eajur.Wen
 * @version 1.0
 * @date 2022-11-16 00:04:23
 */
public class Directory implements Node {
    private String path;
    private List<Node> nodes = new ArrayList<>();
    public Directory(String path) {
        this.path = path;
    }
    public Directory(Directory parentPath, String dirName) {
        parentPath.addChild(this);
        this.path = parentPath.getPath() + "/" + dirName;
    }
    @Override
    public String getPath() {
        return this.path;
    }
    @Override
    public void print() {
        System.out.println("/" + path);
        for (Node node : this.nodes) {
            node.print();
        }
    }
    public void addChild(Node node) {
        this.nodes.add(node);
    }
}
/**
 * 叶子节点类
 *
 * @author Eajur.Wen
 * @version 1.0
 * @date 2022-11-16 00:05:36
 */
public class File implements Node {
    private String filename;
    private Directory directory;
    public File(Directory directory, String filename) {
        directory.addChild(this);
        this.filename = filename;
    }
    @Override
    public String getPath() {
        return this.directory.getPath() + filename;
    }
    @Override
    public void print() {
        System.out.println("--" + filename);
    }
}
/**
 * 测试类
 *
 * @author Eajur.Wen
 * @version 1.0
 * @date 2022-11-16 07:43:52
 */
public class Client {
    public static void main(String[] args) {
        Directory rootDir = new Directory("root");
        Directory optDir = new Directory(rootDir,"opt");
        Directory ectDir = new Directory(rootDir,"ect");
        Directory confDir = new Directory(optDir,"conf");
        File nginxConf = new File(confDir, "nginx.conf");
        File dockerfile = new File(confDir, "Dockerfile");
        Directory userDir = new Directory(ectDir, "eajur");
        rootDir.print();
        System.out.println("-----------------");
        optDir.print();
        System.out.println("-----------------");
        ectDir.print();
    }
}

5、适用场景

组合模式的目的就是将一系列相似对象组设置为树形结构,方便对某一个节点下的内容进行操作。所以组合模式适用于出现树形结构的地方。例如:多级菜单显示,文件目录显示,多级目录呈现等树形结构数据的操作。

© 版权声明
好牛新坐标 广告
版权声明:
1、IT大王遵守相关法律法规,由于本站资源全部来源于网络程序/投稿,故资源量太大无法一一准确核实资源侵权的真实性;
2、出于传递信息之目的,故IT大王可能会误刊发损害或影响您的合法权益,请您积极与我们联系处理(所有内容不代表本站观点与立场);
3、因时间、精力有限,我们无法一一核实每一条消息的真实性,但我们会在发布之前尽最大努力来核实这些信息;
4、无论出于何种目的要求本站删除内容,您均需要提供根据国家版权局发布的示范格式
《要求删除或断开链接侵权网络内容的通知》:https://itdw.cn/ziliao/sfgs.pdf,
国家知识产权局《要求删除或断开链接侵权网络内容的通知》填写说明: http://www.ncac.gov.cn/chinacopyright/contents/12227/342400.shtml
未按照国家知识产权局格式通知一律不予处理;请按照此通知格式填写发至本站的邮箱 wl6@163.com

相关文章