当前位置: 首页 > news >正文

软考79-上午题-【面向对象技术3-设计模式】-结构型设计模式02

一、组合模式

1-1、意图

将对象组合成树型结构,以表示"部分-整体"的层次结构。Composite使得用户对单个对象和组

合对象的使用具有一致性。

示例:对象:文件、文件夹

1-2、结构

  • Component 为组合中的对象声明接口;在适当情况下实现所有类共有接口的默认行为;声明一个接口用于访问和管理 Component 的子组件;(可选) 在递归结构中定义一个接口,用于访问一个父组件,并在合适的情况下实现它。
  • Leaf 在组合中表示叶结点对象,叶结点没有子结点: 在组合中定义图元对象的行为。
  • Composite 定义有子组件的那些组件的行为;存储子组件;在 Component 接口中实现与子组件有关的操作。
  • Client 通过 Component 接口操纵组合组件的对象

1-3、代码实现

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();
}
// 文件夹
public class Folder extends AbstractFile {private List<AbstractFile> childrenList = new ArrayList<AbstractFile>();public Folder(String name){this.name = name;}@Overridepublic boolean Add(AbstractFile file) {return childrenList.add(file);}@Overridepublic boolean remove(AbstractFile file) {return childrenList.remove(file);}@Overridepublic List<AbstractFile> getChild() {return childrenList;}}
// 文件
public class File extends AbstractFile {public File(String name){this.name = name;}@Overridepublic boolean Add(AbstractFile file) {return false;}@Overridepublic boolean remove(AbstractFile file) {return false;}@Overridepublic List<AbstractFile> getChild() {return null;}
}
// 客户端
public class CompositePattern {public static void main(String[] args) {AbstractFile rootFolder = new Folder("rootFolder");AbstractFile folderA = new Folder("Folder A");AbstractFile folderB = new Folder("Folder B");AbstractFile fileC = new File("File C");AbstractFile fileD = new File("File D");AbstractFile fileE = new File("File E");rootFolder.Add(folderA);rootFolder.Add(folderB);rootFolder.Add(fileC);folderB.Add(fileD);folderB.Add(fileE);print(rootFolder);}static void print(AbstractFile file){file.printName();List<AbstractFile> allFile = file.getChild();if(allFile == null){return;}for(AbstractFile fileChild : allFile){/*System.out.println("==========");fileChild.printName();*/print(fileChild);// 递归}}}

1-4、适用性

  • 想表示对象的部分-整体层次结构。
  • 希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

1-5、真题

真题1:

真题2:

真题3:

二、装饰模式

2-1、意图

动态地给一个对象添加一些额外的职责。

就增加功能而言,Decorator 模式比生成子类更加灵活。

2-2、结构

  • Component 定义一个对象接口,可以给这些对象动态地添加职责;
  • ConcreteComponent 定义一个对象,可以给这个对象添加一些职责;
  • Decorator 维持一个指向 Component 对象的指针,并定义一个与 Component 接口一致的接口。
  • ConcreteDecorator 向组件添加职责。

2-3、代码实现

abstract class Person {protected String name;// 职责public abstract void Operation();
}
public class Student extends Person{public Student(String name){this.name = name;}@Overridepublic void Operation() {System.out.print(name + "的职责:学习 ");}
}
// 装饰器
abstract class Decorator extends Person{// Decorator 维持一个指向 Component 对象的指针protected Person person;
}
public class DecoratorA extends Decorator{public DecoratorA(Person person){this.person = person;}@Overridepublic void Operation() {// 原本的职责person.Operation();// 新的职责System.out.print("写作业 ");}
}
public class DecoratorB extends Decorator{public DecoratorB(Person person){this.person = person;}@Overridepublic void Operation() {// 原本的职责person.Operation();// 新的职责System.out.print("考试 ");}
}

// 客户端
public class DecoratorPattern {public static void main(String[] args) {Person zhangSan = new Student("张三");zhangSan.Operation();// 张三的职责:学习System.out.println();zhangSan = new DecoratorA(zhangSan);zhangSan.Operation();// 张三的职责:学习 写作业System.out.println();zhangSan = new DecoratorB(zhangSan);// 张三的职责:学习 写作业 考试zhangSan.Operation();System.out.println("=============");// 对象链Person lili = new DecoratorB(new DecoratorA(new Student("丽丽")));lili.Operation();// 丽丽的职责:学习 写作业 考试}}

2-4、适用性

  • 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责
  • 处理那些可以撤销的职责。
  • 当不能采用生成子类的方式进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是,由于类定义被隐藏,或类定义不能用于生成子类。 

2-5、真题

真题1:

相关文章:

软考79-上午题-【面向对象技术3-设计模式】-结构型设计模式02

一、组合模式 1-1、意图 将对象组合成树型结构&#xff0c;以表示"部分-整体"的层次结构。Composite使得用户对单个对象和组 合对象的使用具有一致性。 示例&#xff1a;对象&#xff1a;文件、文件夹 1-2、结构 Component 为组合中的对象声明接口&#xff1b;在适…...

前端面试拼图-知识广度

摘要&#xff1a;最近&#xff0c;看了下慕课2周刷完n道面试题&#xff0c;记录并添加部分可参考的文档&#xff0c;如下... 1. 移动端H5 click有300ms延迟&#xff0c; 如何解决&#xff1f; 背景&#xff1a;double tap to zoom 移动端H5中的300ms点击延迟问题通常是由浏览…...

Android 开发 地图 polygon 显示信息

问题 Android 开发 地图 polygon 显示信息 详细问题 笔者进行Android项目开发&#xff0c;接入高德地图绘制区域后&#xff0c;需要在指定区域&#xff08;位置&#xff09;内显示文本信息&#xff0c;如何实现 实现效果 解决方案 代码 import com.amap.api.maps.model.T…...

flink1.18.0报错 an implicit exists from scala.Int => java.lang.Integer, but

完整报错 type mismatch;found : Int(100)required: Object Note: an implicit exists from scala.Int > java.lang.Integer, but methods inherited from Object are rendered ambiguous. This is to avoid a blanket implicit which would convert any scala.Int to a…...

掌握C语言结构体,开启编程新世界

✨✨欢迎&#x1f44d;&#x1f44d;点赞☕️☕️收藏✍✍评论 个人主页&#xff1a;秋邱博客 所属栏目&#xff1a;C语言 &#xff08;感谢您的光临&#xff0c;您的光临蓬荜生辉&#xff09; 前言 前面我们也涉及到了结构体的讲解&#xff0c;但是只是粗略的讲了一下。 接下…...

YOLOv3学习

YOLOv3仅使用卷积层&#xff0c;使其成为一个全卷积网络&#xff08;FCN&#xff09;。文章中&#xff0c;作者提出一个新的特征提取网络&#xff0c;Darknet-53。正如其名&#xff0c;它包含53个卷积层&#xff0c;每个后面跟随着batch normalization层和leaky ReLU层。没有池…...

oracle实现批量插入

一、Dao层(增加Parm参数) void insert(Param("list") List<TicketInfo> ticketInfos); 二、Mapper层(加入条件判断值是否为空) insert all<foreach collection"list" item"item" index"index">into 表名<trim prefix…...

游戏客户端开发

1、LOL里面用到的是什么同步机制&#xff1f; 2、网络不好的情况下人物会出现瞬移等情况&#xff0c;怎样避免&#xff1f; 3、游戏里面有没有涉及数据存储&#xff0c;如存档之类的&#xff1f;、 4、如果让你设计存档&#xff0c;会如何着手&#xff1f; 5、以二进制方式…...

电商API接口苏宁易购获得suning商品详情页实时数据API请求接入演示

要接入苏宁易购的API接口获取商品详情页实时数据&#xff0c;你需要遵循以下步骤&#xff1a; 注册成为开放平台的开发者&#xff0c;获取ApiKey和ApiSecret。 使用ApiKey和ApiSecret获取访问令牌&#xff08;AccessToken&#xff09;。 使用AccessToken调用苏宁易购的API接口…...

数据类型转换篇(二)

文章目录 7.11 float()7.12 hex()7.13 int()7.14 list()7.15 oct()7.16 ord()7.17 repr()7.18 set()7.19 str()7.20 tuple() 7.11 float() float() 是 Python 的内置函数&#xff0c;用于将一个数值或数值表示的字符串转换成浮点数&#xff08;floating point number&#xff…...

新零售SaaS架构:线上商城系统架构设计

零售商家为什么要建设线上商城&#xff1f; 传统的实体门店服务范围有限&#xff0c;只能吸引周边500米以内的消费者。因此&#xff0c;如何拓展服务范围&#xff0c;吸引更多的消费者到店&#xff0c;成为了店家迫切需要解决的问题。 缺乏忠实顾客&#xff0c;客户基础不稳&a…...

Word文档密码设置:Python设置、更改及移除Word文档密码

给Word文档设置打开密码是常见的Word文档加密方式。为Word文档设置打开密码后&#xff0c;在打开该文档时&#xff0c;需要输入密码才能预览及编辑&#xff0c;为Word文档中的信息提供了有力的安全保障。如果我们需要对大量的Word文档进行加密、解密处理&#xff0c;Python是一…...

jar读取目录配置、打包jar后无法获取目录下的配置

jar读取目录配置、打包jar后无法获取目录下的配置 jar读取目录配置、打包jar后无法获取目录下的配置。java打成jar包后获取不到配置文件路径。解决项目打成jar包上线无法读取配置文件。打包jar后无法读取resource下的配置文件 场景 需要读取 src/main/resources/mapper下的所…...

python第三次项目作业

打印课堂上图案 判断一个数是否是质数&#xff08;素数&#xff09; 设计一个程序&#xff0c;完成(英雄)商品的购买&#xff08;界面就是第一天打印的界面&#xff09; 展示商品信息(折扣)->输入商品价格->输入购买数量->提示付款 输入付款金额->打印购买小票&a…...

架构之安全性维度

流程安全性 安全基本原则&#xff1a;可用性 完整性 机密性 CIA 安全框架&#xff1a;zachman P2DR Sabsa IPDRR IATF 安全评估方法&#xff1a;安全测试&#xff1a; SAST静态测试、 IAST交互测试 安全扫描 危险模型&#xff1a;攻击树分析 DREAD风险评估 渗透测试&#xff1a…...

odoo字段访问控制

在 Odoo 中&#xff0c;可以通过几种方式实现字段的访问控制&#xff0c;包括通过模型安全规则、记录规则和字段属性来限制字段的访问。 1. 使用模型安全规则 模型安全规则&#xff08;也称为访问控制列表&#xff0c;ACLs&#xff09;允许你定义哪些用户组可以对哪些模型进行…...

mysql的基本知识点-操作数据库表

创建数据库&#xff1a; CREATE DATABASE database_name;创建一个名字为database_name的数据库&#xff1b; 删除数据库&#xff1a; DROP DATABASE database_name;删除名字为database_name的数据库&#xff1b; 在执行删除数据库操作前&#xff0c;请确保你确实想要删除数据…...

基于Springboot的疫情物资管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的疫情物资管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…...

【postgresql 基础入门】表的约束(一)主键与外键,数据的实体完整性与参照完整性,外键引用数据被修改时的动作触发

主键与外键-表的约束(一) ​专栏内容&#xff1a; postgresql内核源码分析手写数据库toadb并发编程 个人主页&#xff1a;我的主页 管理社区&#xff1a;开源数据库 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 系列文章…...

centos 7 添加启动脚本

centos 7 java 开机启动 在CentOS 7上配置Java应用程序开机启动&#xff0c;可以通过创建一个systemd服务单元来实现。以下是步骤和示例代码&#xff1a; 创建一个新的systemd服务文件。 sudo vi /etc/systemd/system/your-java-app.service 在该文件中添加以下内容&#xff…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具&#xff0c;支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议&#xff0c;涵盖接口测试、性能测试、数字体验监测等测试类型…...