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

java设计模式--组合模式、适配器模式

组合模式

组合模式(Composite Pattern)允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式让客户端可以统一地处理单个对象和组合对象。在这个模式中,组合对象(Composite)和叶子对象(Leaf)会实现相同的接口。

下面是一个使用组合模式的简单案例,我们将构建一个文件系统的表示,其中可以包含文件夹(组合对象)和文件(叶子对象)。

首先,定义一个公共接口 IFileSystemEntry,该接口将由文件夹和文件实现:

java

interface IFileSystemEntry {  void list();  
}
然后,定义叶子对象 File,它实现了 IFileSystemEntry 接口:java
class File implements IFileSystemEntry {  private String name;  public File(String name) {  this.name = name;  }  @Override  public void list() {  System.out.println("File: " + name);  }  
}

接着,定义组合对象 Folder,它也实现了 IFileSystemEntry 接口,并且可以包含多个 IFileSystemEntry 对象(即文件夹或文件):

java

import java.util.ArrayList;  
import java.util.List;  class Folder implements IFileSystemEntry {  private String name;  private List<IFileSystemEntry> children = new ArrayList<>();  public Folder(String name) {  this.name = name;  }  public void add(IFileSystemEntry entry) {  children.add(entry);  }  @Override  public void list() {  System.out.println("Folder: " + name);  for (IFileSystemEntry entry : children) {  entry.list();  }  }  
}

最后,我们可以构建一个包含文件夹和文件的文件系统,并演示如何使用 list() 方法来列出所有文件和文件夹:

java

public class CompositePatternDemo {  public static void main(String[] args) {  // 创建文件夹和文件  Folder root = new Folder("root");  Folder folder1 = new Folder("folder1");  Folder folder2 = new Folder("folder2");  File file1 = new File("file1.txt");  File file2 = new File("file2.txt");  // 组织结构  root.add(folder1);  root.add(folder2);  folder1.add(file1);  folder2.add(file2);  // 打印文件系统  root.list();  }  
}

输出结果:

Folder: root  
Folder: folder1  
File: file1.txt  
Folder: folder2  
File: file2.txt

这个示例展示了组合模式的基本应用,即如何通过递归调用 list() 方法来统一处理文件和文件夹的列表展示。

适配器模式

适配器模式(Adapter Pattern)是一种结构型设计模式,它允许一个接口(通常是新的或现有的)与另一个不兼容的接口一起工作。适配器模式主要用于解决接口不匹配的问题,让原本由于接口不兼容而不能一起工作的类可以一起工作。

下面,我将通过一个简单的例子来展示适配器模式的应用。假设我们有一个老式的电源插座(两孔插座),但我们想使用一个需要三孔插座的电器设备。为了解决这个问题,我们可以使用一个电源适配器来转换插座类型。

定义接口
首先,我们定义两个接口,分别代表两孔插座和三孔插座:

java

// 两孔插座接口  
public interface TwoPinSocket {  void powerSupply();  
}  // 三孔插座接口  
public interface ThreePinSocket {  void powerSupply();  
}

实现接口
然后,我们实现这两个接口。假设我们有一个真实存在的两孔插座实现,但没有直接的三孔插座实现(因为我们要模拟的是通过适配器来适配的情况):

java

// 两孔插座实现  
public class RealTwoPinSocket implements TwoPinSocket {  @Override  public void powerSupply() {  System.out.println("Providing power through two pins.");  }  
}  

// 假设没有直接的三孔插座实现,我们通过适配器来适配
适配器类
接下来,我们创建一个适配器类,这个类将两孔插座适配为三孔插座:
java

public class Adapter extends RealTwoPinSocket implements ThreePinSocket {  // 注意:这里我们继承自RealTwoPinSocket,但实现ThreePinSocket接口  // 适配器内部使用两孔插座的供电能力  @Override  public void powerSupply() {  // 调用两孔插座的供电方法  super.powerSupply();  // 可以在这里添加额外的逻辑来模拟三孔插座特有的功能,如果有的话  System.out.println("Adapting power for three pins.");  }  
}

客户端代码
最后,我们编写客户端代码来演示如何使用这个适配器:

java

public class Client {  public static void main(String[] args) {  // 创建一个两孔插座的实例  TwoPinSocket twoPinSocket = new RealTwoPinSocket();  // 但我们需要一个三孔插座,所以我们使用适配器  ThreePinSocket threePinSocket = new Adapter();  // 使用三孔插座供电  threePinSocket.powerSupply();  // 输出:  // Providing power through two pins.  // Adapting power for three pins.  }  
}

在这个例子中,Adapter 类将 RealTwoPinSocket 的功能适配成了 ThreePinSocket 接口所要求的形式,使得原本只能接受三孔插座的电器设备可以通过这个适配器使用两孔插座进行供电。这就是适配器模式的基本思想。

相关文章:

java设计模式--组合模式、适配器模式

组合模式 组合模式&#xff08;Composite Pattern&#xff09;允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式让客户端可以统一地处理单个对象和组合对象。在这个模式中&#xff0c;组合对象&#xff08;Composite&#xff09;和叶子对象&#xff08;Lea…...

保姆级-C#与Halcon的窗体界面展示阈值分割图像教程(机器视觉保姆级教程)

经历上一篇《零基础小白实现C#调用halcon dll的过程&#xff0c;并测试程序证明C#halcon联合开发成功》的发布已经过去三天啦&#xff0c; 零基础小白实现C#调用halcon dll的过程&#xff0c;并测试程序证明C#halcon联合开发成功_添加halcondotnet.dll-CSDN博客 在友友的催更下…...

Kotlin学习-01创建kotlin学习环境

安装idea https://www.jetbrains.com/zh-cn/ 创建项目 选择kotlin 修改Main.kt fun main() {print("Hello World!") }运行...

NGINX 之 location 匹配优先级

章节 1 NGINX 的源码安装 2 NGINX 核心配置详解 3 NGINX 之 location 匹配优先级 4 NGINX 基础参数与功能 目录 1 location 基础语法 1.1 location 语法说明表 1.2 URI部分简单介绍 2 location 匹配优先级 2.1 URI匹配的规则与顺序 2.2 精确匹配(location /1.txt) 2.3 区…...

算法_字符串专题---持续更新

文章目录 前言最长公共前缀题目要求题目解析代码如下 最长回文子串题目要求题目解析代码如下 二进制求和题目要求题目解析 字符串相乘题目要求题目解析代码如下 前言 本文将会向你介绍有关字符串的相关题目&#xff1a;最长公共前缀、最长回文子串、二进制求和、字符串相乘。本…...

Anaconda与conda、pip与conda的区别

Anaconda与conda、pip与conda的区别 1. 引言1.1 背景介绍1.2 文章目的 2. 什么是Anaconda&#xff1f;2.1 Anaconda简介2.2 Anaconda的优势2.3 Anaconda的安装与配置 3. 什么是Conda&#xff1f;3.1 Conda简介3.2 Conda的功能和用途3.3 Conda与Anaconda的关系 4. 什么是Pip&…...

odoo Request Entity Too Large

在数据库恢复中&#xff0c;文件有256M大小&#xff0c;无法正常恢复下。显示如下&#xff1a; 解决办法&#xff1a; 修改http.py文件里面的 DEFAULT_MAX_CONTENT_LENGTH参数&#xff0c; odoo\http.py DEFAULT_MAX_CONTENT_LENGTH 128 * 1024 * 1024 # 128MiB 修改为300M,即…...

【C++ 面试 - 面向对象】每日 3 题(六)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…...

基于tcp c/s的网络通信

TCP&#xff08;即传输控制协议&#xff09;&#xff1a;是一种面向连接的传输层协议&#xff0c;它能提供高可靠性通信(即数 据无误、数据无丢失、数据无失序、数据无重复到达的通信) tcp协议特点: 1. 面向连接 //类似打电话通话之前 &#xff0c;必须先打通 2. 可靠传输 …...

论文翻译:Universal and Transferable Adversarial Attacks on Aligned Language Models

Universal and Transferable Adversarial Attacks on Aligned Language Models https://arxiv.org/pdf/2307.15043v2 通用且可转移的对抗性攻击对齐语言模型 文章目录 通用且可转移的对抗性攻击对齐语言模型摘要1 引言2 一个针对LLMs的通用攻击2.1 产生肯定回应2.2 贪婪坐标梯…...

Axure RP 9高手速成秘籍:解锁终极快捷键,设计效率飙升10倍!

Axure RP 9作为一款功能强大的原型设计工具&#xff0c;提供了丰富的快捷键来加速设计流程。以下是一份详尽的Axure RP 9快捷键大全&#xff0c;旨在帮助用户更高效地完成设计工作。 一、文件操作 新建&#xff1a;Ctrl N&#xff08;Windows&#xff09;/ Command N&#…...

Springcloud从零开始--Eureka(一)

Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发&#xff0c;如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等&#xff0c;都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有…...

[数据集][目标检测]agvs仓储机器人检测数据集VOC+YOLO格式967张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;967 标注数量(xml文件个数)&#xff1a;967 标注数量(txt文件个数)&#xff1a;967 标注类别…...

(八)Flink Join 连接

在分布式数据处理中,JOIN 是一个非常重要的操作。Flink 的 JOIN 是用于将两个数据流按照一定的条件进行连接,生成新的数据流。Flink 双流 JOIN 主要分为两大类:一类是基于窗口的 JOIN 操作,另一类是基于原生 State 的 Connect 算子操作。其中基于窗口的 JOIN 可细分为 Wind…...

你也想转行成为一名程序员吗?作为过来人的我希望你想清楚这几个问题再做决定

1 有个朋友突然找我&#xff1a;“现在的工作不想干了&#xff0c;我现在转行搞IT能不能行&#xff1f;学哪个编程语言比较有前景&#xff1f;现在去搞网络安全应该没问题吧&#xff1f;”我相信&#xff0c;很多人出于各种原因都在考虑要不要进行职业转换&#xff0c;迷茫又焦…...

Linux文件属性和打包压缩详解

1、文件属性体系 1.1 文件系统概述 [rootyunwei /]# ls -lhi 总用量 72K3505 lrwxrwxrwx. 1 root root 7 3月 7 2019 bin -> usr/bin 262152 dr-xr-xr-x. 5 root root 4.0K 12月 19 16:00 boot 399635 drwxr-xr-x 2 root root 4.0K 11月 5 2019 data1026 drw…...

微服务注册到nacos时,注册失败报错解决

微服务注册到nacos时&#xff0c;注册失败报错解决 微服务注册nacos时报错nacos报错alipay-jraft.log日志报错原因排查 微服务注册nacos时报错 NacosException: failed to req API:/nacos/v1/ns/instance/list after all servers([127.0.0.1:28100]) tried: ErrCode:503, ErrM…...

基于Sringboot+Vue个人驾校预约管理系统--论文pf

TOC springboot503基于SringbootVue个人驾校预约管理系统--论文pf 第1章 绪论 1.1选题动因 当前的网络技术&#xff0c;软件技术等都具备成熟的理论基础&#xff0c;市场上也出现各种技术开发的软件&#xff0c;这些软件都被用于各个领域&#xff0c;包括生活和工作的领域。…...

python-逆序数(赛氪OJ)

[题目描述] 在一个排列中&#xff0c;如果一对数的前后位置与大小顺序相反&#xff0c;即前面的数大于后面的数&#xff0c;那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。比如一个元素个数为 4 的数列&#xff0c;其元素为 2,4,3,1&#xff0c;则 (2,…...

PCIE-flit mode retry

下一个即将发送的seq num: 下一个即将发送的ack或者nak的seq num: Tx发送exp seq num的个数: Tx发送nak的个数 下一个期望收到的flit的seq num&#xff0c;注意是指下个期望收到的有效的、non-idle、non_duplictae的flit: 收到的flit的真实的seq num&#xff08;implicit…...

WAN2.2文生视频镜像快速部署:NVIDIA驱动适配+ComfyUI插件自动加载教程

WAN2.2文生视频镜像快速部署&#xff1a;NVIDIA驱动适配ComfyUI插件自动加载教程 1. 环境准备与快速部署 WAN2.2是一个强大的文生视频工具&#xff0c;结合了SDXL Prompt风格支持&#xff0c;能够根据中文提示词生成高质量视频内容。这个镜像已经预配置了所有必要的组件&…...

数据科学模型评估终极指南:交叉验证与性能指标完全解析

数据科学模型评估终极指南&#xff1a;交叉验证与性能指标完全解析 【免费下载链接】awesome-datascience awesome-datascience: 是一个包含各种数据科学资源、工具和实践的汇总列表。适合数据科学家、分析师和开发者查找和学习数据科学的知识和技术。 项目地址: https://git…...

【CP AUTOSAR】Icu驱动模块:从原理到实战的配置与优化指南

1. Icu驱动模块在AUTOSAR架构中的核心作用 第一次接触AUTOSAR的Icu模块时&#xff0c;我完全被它复杂的配置项搞懵了。直到在S32K3项目上实际调试电机转速测量功能&#xff0c;才真正理解这个模块的价值。简单来说&#xff0c;Icu就像汽车电子系统的"脉搏检测仪"&…...

如何快速上手Archivy:5分钟搭建个人知识管理系统

如何快速上手Archivy&#xff1a;5分钟搭建个人知识管理系统 【免费下载链接】archivy Archivy is a self-hostable knowledge repository that allows you to learn and retain information in your own personal and extensible wiki. 项目地址: https://gitcode.com/gh_mi…...

如何在conda环境中正确配置RStudio Server的R路径

在Conda环境中精准配置RStudio Server的R路径指南 引言 对于数据科学家和分析师而言&#xff0c;RStudio Server提供了一个强大的协作开发环境&#xff0c;而Conda则是管理复杂依赖关系的利器。当两者结合使用时&#xff0c;如何确保RStudio Server能够准确识别并使用Conda环境…...

Realistic Vision V5.1 性能调优:针对STM32嵌入式设备图像生成的优化思路探讨

Realistic Vision V5.1 性能调优&#xff1a;针对STM32嵌入式设备图像生成的优化思路探讨 最近在捣鼓一个挺有意思的项目&#xff0c;想把一些前沿的AI图像生成能力&#xff0c;塞进像STM32F103C8T6这种资源极其有限的嵌入式设备里。你可能要问了&#xff0c;这怎么可能&#…...

如何快速搭建Windows syslog服务器:开源日志监控终极指南

如何快速搭建Windows syslog服务器&#xff1a;开源日志监控终极指南 【免费下载链接】visualsyslog Syslog Server for Windows with a graphical user interface 项目地址: https://gitcode.com/gh_mirrors/vi/visualsyslog 在Windows环境下高效监控Unix/Linux系统和网…...

微信聊天记录永久保存终极指南:如何用WeChatMsg免费备份你的珍贵对话

微信聊天记录永久保存终极指南&#xff1a;如何用WeChatMsg免费备份你的珍贵对话 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Tre…...

MOOTDX实战指南:零门槛获取股票数据的Python解决方案

MOOTDX实战指南&#xff1a;零门槛获取股票数据的Python解决方案 【免费下载链接】mootdx 通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx 副标题&#xff1a;量化投资 | 金融数据接口 | Python工具库 一、价值定位&#…...

论文写作“黑科技”:书匠策AI,让课程论文创作如虎添翼!

在学术探索的征途中&#xff0c;每一位学子都渴望拥有一把开启智慧之门的钥匙&#xff0c;尤其是在面对课程论文这一挑战时&#xff0c;更是希望能有得力助手助自己一臂之力。今天&#xff0c;就让我带你揭开书匠策AI科研工具的神秘面纱&#xff0c;看看它是如何成为你课程论文…...