【结构型】组合模式(Composite)

news2024/11/17 5:40:23

目录

    • 组合模式(Composite)
    • 适用场景
    • 组合模式实例代码(Java)

组合模式(Composite)

将对象组合成树型结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。

适用场景

  • 想表示对象的部分-整体层次结构。
  • 希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
    在这里插入图片描述
    ✦ Component为组合中的对象声明接口;在适当情况下实现所有类共有接口的默认行为:声明一个接口用于访问和管理Component的子组件;(可选)在递归结构中定义一个接口,用于访问一个父组件,并在合适的情况下实现它。
    ✦ Leaf在组合中表示叶结点对象,叶结点没有子结点;在组合中定义图元对象的行为。
    ✦ Composite定义有子组件的那些组件的行为;存储子组件;在Component接口中实现与子组件有关的操作。
    ✦ Client通过Component接口操纵组合组件的对象。

组合模式实例代码(Java)

import java.util.*;

//抽象组合文件——对应Component
abstract class AbstractFile {
    protected String name;

    public void printName() {
        System.out.println(name);
    }

    //添加子组件
    public abstract boolean Add(AbstractFile file);
    //删除子组件
    public abstract boolean Remove(AbstractFile file);
    public abstract List<AbstractFile> getChild();
}

//文件夹——对应Composite
class Folder extends AbstractFile {
    //Composite可以存储子组件
    private List<AbstractFile> childrenList = new ArrayList<AbstractFile>();

    public Folder(String name) {
        this.name = name;
    }
    
    @Override
    public boolean Add(AbstractFile file) {
        return childrenList.add(file);
    }
    @Override
    public boolean Remove(AbstractFile file) {
        return childrenList.remove(file);
    }
    @Override
    public List<AbstractFile> getChild() {
        return childrenList;
    }
}

//文件——对应Leaf
class File extends AbstractFile {
    public File(String name) {
        this.name = name;
    }

    @Override
    public boolean Add(AbstractFile file) {
        return false;
    }
    @Override
    public boolean Remove(AbstractFile file) {
        return false;
    }
    @Override
    public List<AbstractFile> getChild() {
        return null;
    }
}


public class CompositeMain {
    public static void main(String[] args) {
        // 父类名 对象名 = new 子类名();
        AbstractFile root = new Folder("root");
        AbstractFile folderA = new Folder("folderA");
        AbstractFile folderB = new Folder("folderB");

        AbstractFile fileC = new File("fileC");
        AbstractFile fileD = new File("fileD");
        AbstractFile fileE = new File("fileE");

        root.Add(folderA);
        root.Add(folderB);
        root.Add(fileC);

        folderA.Add(fileD);
        folderA.Add(fileE);

        print(root);
    }

    static void print(AbstractFile file) {
        file.printName();

        List<AbstractFile> childrenList = file.getChild();
        if (childrenList == null) {
            return;
        }

        // for (对象类型 对象名 : 遍历对象)
        for (AbstractFile children : childrenList) {
            // children.printName();
            print(children);
        }
    }
}

其他设计模式详见本专栏其他博文~
特别感谢zst_2001在备考软考期间提供的帮助,贴上博主B站
zst_2001的个人空间

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/125765.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java判断null的几种方式

组内code review时&#xff0c;有同学提到字符串判断空值的写法&#xff0c;如下两种&#xff0c;&#xff08;1&#xff09;null在后&#xff0c;Test public void testDemo1() {String str null;if (str null) {System.out.println("null在后");return;} }&#…

计算机的人机交互

1、 计算机的人机交互发展历史 计算机在刚开始出现的时候&#xff0c;因为占地广、造价高、耗电高的原因&#xff0c;一般都是给军队、政府使用的&#xff0c;并不是给个人使用的。随着计算机的发展&#xff0c;体积越来越小&#xff0c;出现了微型机&#xff0c;才使得计算机…

C# 数据库 ADO.NET概述

一 数据库 1 数据库&#xff08;Database&#xff09; 2 数据库管理系统&#xff08;DBMS&#xff09; 如Oracle,MS SQL Server 3 数据库系统的优点 共享性、独立性、完整性、冗余数据少。 4 管理功能 数据定义/操纵/完整/完全/并发 二 常用的数据库管理系统 1 微软的…

剑指offer----C语言版----第二天

目录 1. 二维数组中的查找 1.1 题目描述 1.1 思路一 1.2 思路二 1.3 思路三&#xff08;最优解&#xff09; 1. 二维数组中的查找 原题链接&#xff1a;剑指 Offer 04. 二维数组中的查找 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/er-wei-shu-…

WinServer 2012 域控组策略 用户发布软件部署

本例演示安装 Notepad 这款软件 因为域中发布软件只支持 msi 格式&#xff0c;所以要把 exe 转成 msi 格式&#xff0c;可以用这个软件 https://www.advancedinstaller.com/ 1、转换格式 &#xff08;1&#xff09;选择 MSI from EXE &#xff08;2&#xff09;定义项目名…

PLC实现十字路口交通灯的控制课程设计毕业设计

微信公众号&#xff1a;创享日记 对话框发送&#xff1a;plc十字路口 获取完整源码源程序文件 要求&#xff1a; 1、信号灯受启动及停止按钮的控制&#xff0c;当按下启动按钮时&#xff0c;信号灯系统开始工作&#xff0c;并周而复始地循环工作&#xff0c;当按下停止按钮时&…

【再学Tensorflow2】TensorFlow2的核心概念

TensorFlow2的核心概念Tensorflow中的张量常量张量变量张量Tensorflow中的计算图计算图介绍静态计算图动态计算图Autograph张量Tensor、图Graph、操作Operation、会话Session模型Model与层LayerTensorflow中的自动微分机制利用梯度磁带求导数利用梯度磁带和优化器求最小值参考资…

ArcGIS基础实验操作100例--实验13 数字化面图形的技巧

本实验专栏来自于汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 基础编辑篇--实验13 数字化面图形的技巧 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08…

Android 虚拟机 模拟器 设置梯子代理 for Mac

最近需要Android13的环境&#xff0c;想着刷机或者弄个模拟器。 本着效率优先的原则&#xff0c;现在本地机器上搞个Android模拟器。 打开AndroidStudio&#xff0c;在tool菜单 选择avd&#xff0c;安卓虚拟设备 根据本地电脑选择x86架构&#xff0c;MAC os 10.12&#xff0c…

虹科案例 | 监测各种材料液位居然如此轻松?

应用背景 1 天送达标准给公司带来了压力&#xff0c;要求他们比以往任何时候都更快、更高效地处理物品。对于依赖散装材料的行业尤其如此。例如&#xff1a; 农业 建造 塑胶成型 食品加工 许多这些行业通过将材料存放在箱子、罐或筒仓中来处理材料。为了正确地计…

麦克风采样率设置导致视频会议中声音采集异常问题分享

目录 1、问题描述 2、麦克风音频采集频率引发的声音采集异常 3、修改麦克风采集频率的详细说明 4、最后 这几年&#xff0c;大家已经习惯于使用视频会议软件&#xff08;比如免费的腾讯会议软件&#xff09;进行线上沟通与交流&#xff0c;通过摄像头将头像采集发送到会议中…

ARM专用指令

目录 一、状态寄存器传送指令:访问&#xff08;读写&#xff09;CPSR寄存器 ​编辑 二、软中断指令:触发软中断 三、协处理器指令:操控协处理器的指令 四、伪指令: 一、状态寄存器传送指令:访问&#xff08;读写&#xff09;CPSR寄存器 CPSR寄…

多线程的创建和使用(4种)

1.JDK5.0之前的创建方式 方式一&#xff1a;继承于Thread类 1.创建一个继承于Thread类的子类 2.重写Thread类的run() --> 此线程执行的作声明在run()中 3.创建Thread类的子类的对象 4.通过此对象调用start() 方式二&#xff1a;实现Runnable接口 1.创建一个实现了Runnable…

第三十五章 数论——卡特兰数

第三十五章 数论——卡特兰数一、什么是卡特兰数1、推导2、公式二、卡特兰数的应用1、问题&#xff1a;2、分析3、代码一、什么是卡特兰数 1、推导 我们看下面这个坐标系&#xff1a; 我们从(0,0)(0,0)(0,0)点到(6,6)(6,6)(6,6)点的路线有很多&#xff0c;并且根据我们高中排…

57.return—函数的返回值

57.return-函数的返回值 文章目录57.return-函数的返回值1.定义2.分类3. 没有返回值4.有1个返回值5.有多个返回值6.一个自定义函数只执行一次return语句7.实操练习1.定义 return关键字后接变量名或表达式可以将函数的计算结果返回到调用处。 变量或表达式等同于接收果汁、豆浆…

Chronicle Pro - 一款简单 Mac 理财规划师,管理你的的个人预算

Chronicle Pro - 一款简单 Mac 理财规划师&#xff0c;管理你的的个人预算 使用Chronicle追踪和支付账单&#xff0c;管理你的个人预算&#xff0c;这是一款简单的Mac理财规划师。获得通知&#xff0c;这样你就不会错过下一个付款截止日期;你再也不用付滞纳金了。把你所有的账单…

8 GUI实例

GUI 1 Frame 用来创建窗口&#xff0c;构造函数如下&#xff1a; public Frame() throws HeadlessExceptionpublic Frame(String title) throws HeadlessException 常用方法如下&#xff1a; public class gui_v1 {public static void main(String[] args) {Frame f new F…

用python的turtle库画一个小猪佩奇

小猪佩奇是一个可爱的小猪。她已经四岁了&#xff0c;与她的妈妈&#xff0c;爸爸&#xff0c;和弟弟乔治生活在一起。佩奇最喜欢做的事情是玩游戏&#xff0c;打扮的漂亮&#xff0c;度假&#xff0c;以及在小泥坑里快乐的跳上跳下和与小羊苏西&#xff08;她最好的朋友&#…

Nginx小结1

Nginx 是一个高性能的HTTP和反向代理web服务器&#xff0c;作为负载均衡器&#xff0c;承接的所有请求。核心功能有负载均衡、反向代理、静态资源服务器。另外Nginx还可以使用keepalive结合使用建立主备份机实现高可用。keepalive是在TCP中一个可以检测死连接的机制&#xff0c…

WordPress插件开发教程1:开发第一个WordPress插件

第一步&#xff1a;在 wp-content \ plugins 目录新建一个目录&#xff0c;随便起个名字&#xff0c;比如&#xff1a;my-first-plugin。 第二步&#xff1a;进入 my-first-plugin 目录&#xff0c;新建一个PHP文件&#xff0c;随便起个名字&#xff0c;比如&#xff1a;hello.…