结构型模式 - 组合模式 (Composite Pattern)

ops/2025/2/26 21:48:49/

结构型模式 - 组合模式 (Composite Pattern)

组合模式是一种结构型设计模式,它允许你将对象组合成树形结构以表示 “部分 - 整体” 的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。


经典的例子就是树形结构,里面可以是文件和文件夹的组合,文件夹还可以再往下组合文件夹和文件.

// 抽象组件类,定义文件和文件夹的公共操作
abstract class FileSystemComponent {protected String name;public FileSystemComponent(String name) {this.name = name;}// 获取组件名称public String getName() {return name;}// 显示组件信息,具体实现由子类完成public abstract void display();// 以下方法在叶子节点(文件)中不做实际操作,在组合节点(文件夹)中实现public void add(FileSystemComponent component) {throw new UnsupportedOperationException("不支持该操作");  // 默认抛出异常, 只有文件夹类型的去重写就行}public void remove(FileSystemComponent component) {throw new UnsupportedOperationException("不支持该操作");}public FileSystemComponent getChild(int index) {throw new UnsupportedOperationException("不支持该操作");}
}
// 叶子节点类,代表文件
class File extends FileSystemComponent {public File(String name) {super(name);}// 显示文件信息@Overridepublic void display() {System.out.println("文件: " + getName());}
}
import java.util.ArrayList;
import java.util.List;// 组合节点类,代表文件夹
class Folder extends FileSystemComponent {private List<FileSystemComponent> children = new ArrayList<>();public Folder(String name) {super(name);}// 显示文件夹及其子组件信息@Overridepublic void display() {System.out.println("文件夹: " + getName());for (FileSystemComponent component : children) {System.out.print("  ");component.display();}}// 添加子组件@Overridepublic void add(FileSystemComponent component) {children.add(component);}// 移除子组件@Overridepublic void remove(FileSystemComponent component) {children.remove(component);}// 获取指定索引的子组件@Overridepublic FileSystemComponent getChild(int index) {return children.get(index);}
}

父类默认给 add, remove, getChild 抛出异常, 文件夹类重写父类 add, remove, getChild, 来达到文件夹类有这些方法, 而文件类没有.

这种编码形式可以借鉴, 可以在一定程度上规避一些问题.


http://www.ppmy.cn/ops/161508.html

相关文章

堆排序:高效的选择排序

大家好&#xff01;今天我们来聊聊一种高效的选择排序算法——堆排序&#xff08;Heap Sort&#xff09;。堆排序是一种基于堆这种数据结构的排序算法&#xff0c;它是一种选择排序的优化版本&#xff0c;具有 O(n log n) 的时间复杂度。堆排序非常适合用来处理大规模数据集&am…

学习Flask:Day 1:基础搭建

学习目标&#xff1a;完成第一个Flask应用 # app.py from flask import Flask app Flask(__name__)app.route(/) def home():return <h1>Hello Flask!</h1>app.route(/api/greet/<name>) def greet(name):return {message: fHello {name}!}if __name__ __…

Spring Core面试题

Spring Core面试题 基础概念 Q1: Spring的核心特性有哪些&#xff1f; public class SpringCoreBasicDemo {// 1. IoC容器public class IoCExample {public void iocDemo() {// XML配置Configurationpublic class AppConfig {Beanpublic UserService userService() {return …

【LeetCode Hot100】搜索二维矩阵 II[特殊字符]二分查找 vs 线性搜索,Java实现,图解+代码

&#x1f4bb; [LeetCode Hot100] 搜索二维矩阵 II&#x1f525;二分查找 vs 线性搜索&#xff0c;Java实现&#xff0c;图解代码 ✏️本文对应题目链接&#xff1a;搜索二维矩阵 II &#x1f4cc; 题目描述 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 targ…

JavaWeb 学习笔记

前端基础 HTML-CSS <!doctype html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport"content"widthdevice-width, user-scalableno, initial-scale1.0, maximum-scale1.0, minimum-scale1.0…

2025数学建模竞赛汇总,错过再等一年

01、2025第十届数维杯大学生数学建模挑战赛&#xff08;小国赛&#xff09; 竞赛介绍&#xff1a;数学建模行业内仅次于国赛和美赛的的第三赛事&#xff0c;被多所高校认定为国家级二类竞赛。赛题类型是国内唯一和高教社杯国赛题型风格完全一致的全国性数学建模竞赛&#xff0…

WordPress ABF Freight Edition sql注入漏洞复现(CVE-2024-13485)(附脚本)

免责申明: 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 0x0…

javascript-es6 (五)

内置构造函数 在 JavaScript 中 最主要 的数据类型有 6 种&#xff1a; 基本数据类型&#xff1a; 字符串、数值、布尔、undefined、null 引用类型: 对象 但是&#xff0c;我们会发现有些特殊情况&#xff1a; //普通字符串 const str peiqi console.log(str.length) //…