软考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、意图 将对象组合成树型结构,以表示"部分-整体"的层次结构。Composite使得用户对单个对象和组 合对象的使用具有一致性。 示例:对象:文件、文件夹 1-2、结构 Component 为组合中的对象声明接口;在适…...
前端面试拼图-知识广度
摘要:最近,看了下慕课2周刷完n道面试题,记录并添加部分可参考的文档,如下... 1. 移动端H5 click有300ms延迟, 如何解决? 背景:double tap to zoom 移动端H5中的300ms点击延迟问题通常是由浏览…...
Android 开发 地图 polygon 显示信息
问题 Android 开发 地图 polygon 显示信息 详细问题 笔者进行Android项目开发,接入高德地图绘制区域后,需要在指定区域(位置)内显示文本信息,如何实现 实现效果 解决方案 代码 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语言结构体,开启编程新世界
✨✨欢迎👍👍点赞☕️☕️收藏✍✍评论 个人主页:秋邱博客 所属栏目:C语言 (感谢您的光临,您的光临蓬荜生辉) 前言 前面我们也涉及到了结构体的讲解,但是只是粗略的讲了一下。 接下…...
YOLOv3学习
YOLOv3仅使用卷积层,使其成为一个全卷积网络(FCN)。文章中,作者提出一个新的特征提取网络,Darknet-53。正如其名,它包含53个卷积层,每个后面跟随着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里面用到的是什么同步机制? 2、网络不好的情况下人物会出现瞬移等情况,怎样避免? 3、游戏里面有没有涉及数据存储,如存档之类的?、 4、如果让你设计存档,会如何着手? 5、以二进制方式…...
电商API接口苏宁易购获得suning商品详情页实时数据API请求接入演示
要接入苏宁易购的API接口获取商品详情页实时数据,你需要遵循以下步骤: 注册成为开放平台的开发者,获取ApiKey和ApiSecret。 使用ApiKey和ApiSecret获取访问令牌(AccessToken)。 使用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 的内置函数,用于将一个数值或数值表示的字符串转换成浮点数(floating point numberÿ…...
新零售SaaS架构:线上商城系统架构设计
零售商家为什么要建设线上商城? 传统的实体门店服务范围有限,只能吸引周边500米以内的消费者。因此,如何拓展服务范围,吸引更多的消费者到店,成为了店家迫切需要解决的问题。 缺乏忠实顾客,客户基础不稳&a…...
Word文档密码设置:Python设置、更改及移除Word文档密码
给Word文档设置打开密码是常见的Word文档加密方式。为Word文档设置打开密码后,在打开该文档时,需要输入密码才能预览及编辑,为Word文档中的信息提供了有力的安全保障。如果我们需要对大量的Word文档进行加密、解密处理,Python是一…...
jar读取目录配置、打包jar后无法获取目录下的配置
jar读取目录配置、打包jar后无法获取目录下的配置 jar读取目录配置、打包jar后无法获取目录下的配置。java打成jar包后获取不到配置文件路径。解决项目打成jar包上线无法读取配置文件。打包jar后无法读取resource下的配置文件 场景 需要读取 src/main/resources/mapper下的所…...
python第三次项目作业
打印课堂上图案 判断一个数是否是质数(素数) 设计一个程序,完成(英雄)商品的购买(界面就是第一天打印的界面) 展示商品信息(折扣)->输入商品价格->输入购买数量->提示付款 输入付款金额->打印购买小票&a…...
架构之安全性维度
流程安全性 安全基本原则:可用性 完整性 机密性 CIA 安全框架:zachman P2DR Sabsa IPDRR IATF 安全评估方法:安全测试: SAST静态测试、 IAST交互测试 安全扫描 危险模型:攻击树分析 DREAD风险评估 渗透测试:…...
odoo字段访问控制
在 Odoo 中,可以通过几种方式实现字段的访问控制,包括通过模型安全规则、记录规则和字段属性来限制字段的访问。 1. 使用模型安全规则 模型安全规则(也称为访问控制列表,ACLs)允许你定义哪些用户组可以对哪些模型进行…...
mysql的基本知识点-操作数据库表
创建数据库: CREATE DATABASE database_name;创建一个名字为database_name的数据库; 删除数据库: DROP DATABASE database_name;删除名字为database_name的数据库; 在执行删除数据库操作前,请确保你确实想要删除数据…...
基于Springboot的疫情物资管理系统(有报告)。Javaee项目,springboot项目。
演示视频: 基于Springboot的疫情物资管理系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构…...
【postgresql 基础入门】表的约束(一)主键与外键,数据的实体完整性与参照完整性,外键引用数据被修改时的动作触发
主键与外键-表的约束(一) 专栏内容: postgresql内核源码分析手写数据库toadb并发编程 个人主页:我的主页 管理社区:开源数据库 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. 系列文章…...
centos 7 添加启动脚本
centos 7 java 开机启动 在CentOS 7上配置Java应用程序开机启动,可以通过创建一个systemd服务单元来实现。以下是步骤和示例代码: 创建一个新的systemd服务文件。 sudo vi /etc/systemd/system/your-java-app.service 在该文件中添加以下内容ÿ…...
Unity-MCP协议:可嵌入、可协商的AI上下文通信标准
1. 这不是又一个“AI插件”,而是Unity开发工作流的底层重定义你有没有过这样的时刻:在Unity里反复调整Animator Controller的过渡条件,只为让角色转身动画不穿模;写完一段NavMesh寻路逻辑,却要花两小时调试Agent卡在斜…...
AI赋能5G核心网故障诊断:从PCAP解析到智能根因分析的工程实践
1. 项目概述:当AI遇见5G核心网故障诊断在5G核心网的运维与测试一线干了这么多年,最头疼的莫过于面对海量的PCAP抓包文件。一个复杂的信令流程下来,动辄几千甚至上万个数据包,工程师需要像侦探一样,逐帧审视协议交互&am…...
用STM32CubeMX和HAL库快速上手WS2812B:告别手动计算延时,一键生成驱动框架
基于STM32CubeMX的WS2812B智能灯光控制:从零构建现代化驱动方案在智能硬件和物联网设备快速发展的今天,WS2812B可编程LED灯带因其丰富的色彩表现和简单的单线控制方式,成为创客和工程师们最喜爱的显示组件之一。然而,传统的寄存器…...
微信小程序3D开发框架技术对比:XR-Frame与threejs-miniprogram
随着微信小程序逐步支持3D渲染与AR能力,开发者面临两个主要官方方案:自研的XR-Frame和适配Three.js的threejs-miniprogram。本文将从架构设计、渲染机制、功能集成、开发模式及适用场景等维度进行技术分析,为技术选型提供参考。一、XR-Frame&…...
3步解锁专业级MMD创作:Blender插件如何重塑二次元动画工作流
3步解锁专业级MMD创作:Blender插件如何重塑二次元动画工作流 【免费下载链接】blender_mmd_tools MMD Tools is a blender addon for importing/exporting Models and Motions of MikuMikuDance. 项目地址: https://gitcode.com/gh_mirrors/bl/blender_mmd_tools …...
如何让Rhino 3D模型在Blender中保持完整数据:import_3dm插件深度解析
如何让Rhino 3D模型在Blender中保持完整数据:import_3dm插件深度解析 【免费下载链接】import_3dm Blender importer script for Rhinoceros 3D files 项目地址: https://gitcode.com/gh_mirrors/im/import_3dm 当建筑师需要在Blender中渲染Rhino设计的建筑模…...
3步解锁网易云音乐NCM加密:让音乐真正属于你
3步解锁网易云音乐NCM加密:让音乐真正属于你 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为下载的网易云音乐只能在特定客户端播放而烦恼吗?当你精心收藏的歌曲被NCM格式"锁"在单一平台时&a…...
【MySQL数据库 | 第一篇】 概述
数据库相关概念: 数据库(Database):数据库是指一组有组织的数据的集合,通过计算机程序进行管理和访问。数据库管理系统:操纵和管理数据库的大型软件SQL:操作关系型数据库的编程语言,定义了一套操作关系型数…...
工业云脑:06 现在就能干:树莓派边缘盒子+PLC,10分钟缺陷检测小案例
06 现在就能干:树莓派边缘盒子+PLC,10分钟缺陷检测小案例 今天第九篇06小节——现在就能干:树莓派边缘盒子+PLC,10分钟缺陷检测小案例。新手照着做10分钟就能跑起来,老手一看就知道这玩意儿省了多少钱。以前想上AI检测,得花几万块买专业边缘盒子;现在?树莓派5(RPi 5)…...
因果推断与机器学习融合:量化分析社会运动中镇压与抗议的动态关系
1. 项目概述:当数据科学遇见社会运动如果你研究过社会运动,尤其是那些看似突然爆发、席卷全国的抗议浪潮,你可能会被一个核心问题困扰:国家机器的镇压,究竟是浇灭火焰的冷水,还是火上浇油的催化剂ÿ…...
