首页 > 其他分享 >软件设计模式白话文系列(十二)组合模式

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

时间:2022-11-17 10:55:07浏览次数:41  
标签:String 软件设计 模式 public print Directory new 白话文 节点

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、适用场景

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

标签:String,软件设计,模式,public,print,Directory,new,白话文,节点
From: https://www.cnblogs.com/eajur/p/16898688.html

相关文章

  • 工厂模式
    工厂模式应该是用的频次最高的,他管理着对对象的创建。下面简单介绍下简单工厂、工厂方法、抽象工厂。一、简单工厂应该是其中最简单最直接明了的,一个接口、N个实现,再一组......
  • 2022年11月软件设计师考试知识点分布
    2022年11月软件设计师考试知识点分布薛大龙 邹月平 施游 1、上午知识点分布表1是按题号对应的考试内容。表1按试题号分布的考查内容试题号知识点试题号知识点1RISC38......
  • 06.适配器模式
    适配器模式作为两个不兼容的接口之间的桥梁结合了两个独立接口的功能例如实际中有个两孔的插座,现在需要有个三孔的插口,如果不直接在两孔的class修改,就需要加一个适配cla......
  • postgresql函数:定期删除模式下指定天数前的表数据及分区物理表
    一、现有函数--1、现有函数调用selectods.deletePartitionIfExists('fact_ship'||'_'||to_char(CURRENT_DATE-INTERVAL'2month','yyyymmdd'));--2、函数内容CREAT......
  • 设计模式 -- 工厂模式
    简单工厂模式简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式(静态工厂模式):定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码)......
  • 设计模式 -- 单例模式
    介绍采取一定的方法保证在整个软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其实例对象的方法(静态方法)主要解决:一个全局使用的类频繁地创建与销毁。......
  • 解决Vue中使用history路由模式出现404的问题
    背景vue中默认的路由模式是hash,会出现烦人的符号#,如http://127.0.0.1/#/。改为history模式可以解决这个问题,但是有一个坑是:强刷新、回退等操作会出现404。Vue改用History......
  • 观察者模式
    前言观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模......
  • 软件设计模式白话文系列(十一)享元模式
    1、描述以共享的方法高效地支持大量细粒度对象的复用。在Java中,通过提前初始化对象或者首次使用后记录对象,后续使用就可以复用对象来实现享元模式。类似缓存技术。2、......
  • HeadFirst设计模式-观察者模式
    观察者模式:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,他的所有依赖者都会收到通知并自动更新。   Java代码 c++代码#pragmaonce#include"......