详解集合框架中装饰器模式与适配器模式的具体应用

老伟姑娘_8769

老伟姑娘_8769

2026-04-05

147人浏览

原创

装饰器模式用于不修改原始集合前提下动态增强功能,如collections.synchronizedlist()和unmodifiableset();适配器模式则解决类型不兼容问题,如arrays.aslist()将数组适配为list接口。

详解集合框架中装饰器模式与适配器模式的具体应用

Java集合框架中,装饰器模式和适配器模式不是概念堆砌,而是真实落地在日常API里的设计逻辑。它们解决两类不同问题:一个是在不改原始集合的前提下“加功能”,另一个是让“不匹配的类型能一起用”。下面分场景讲清楚。

装饰器模式:给集合动态加能力

装饰器的核心是“包装+同接口+增强行为”。集合工具类 Collections 提供的一系列 synchronizedXxx()、unmodifiableXxx()、checkedXxx() 方法,就是典型应用。

  • 同步包装:比如 Collections.synchronizedList(new ArrayList()) 返回的是 SynchronizedList 实例,它实现了 List 接口,内部持有一个原始 List 引用,在每个方法调用前后自动加锁,而原始 ArrayList 本身完全没变。
  • 只读包装:调用 Collections.unmodifiableSet(new HashSet()) 得到的是 UnmodifiableSet,它拦截所有修改操作(如 add、clear),抛出 UnsupportedOperationException,但遍历、查询等只读方法照常转发——原始集合仍可被其他引用修改,只是这个“视图”拒绝变更。
  • 关键点:这些装饰器类都继承自 SynchronizedCollection 或类似基类,遵循统一的“持有被装饰对象 + 实现相同接口 + 拦截并增强”的结构,支持多层嵌套,比如先只读再同步:Collections.synchronizedList(Collections.unmodifiableList(list))。

适配器模式:让数组和集合“说同一种话”

适配器要解决的是“类型不兼容但想共用一套逻辑”的问题。最常见例子就是 Arrays.asList() —— 它把一个普通数组(比如 String[])转成一个 List 接口的实现,让数组能用 contains、indexOf 等集合方法。

  • 返回的不是 ArrayList,而是私有静态类 Arrays.ArrayList(注意:和 java.util.ArrayList 同名但不同类),它内部直接持有一个数组引用,所有操作都基于该数组展开,没有复制数据。
  • 这个 Arrays.ArrayList 就是适配器:目标接口是 List,被适配者是原生数组,适配器通过组合(持有数组)+ 实现 List 接口,完成了“让数组表现得像集合”的转换。
  • 限制也很明显:它不支持增删(add、remove 会抛异常),因为数组长度固定;这恰恰说明适配器不做语义强改,只做最小接口对齐。

两者的本质区别一眼看穿

别记定义,记住动作:

  • 装饰器 = “我本来就能干这事,现在给你加个锁 / 加个校验 / 加个日志”,接口不变,行为增强;
  • 适配器 = “你本来不能干这事,但我帮你‘翻译’一下,让你看起来能干”,接口变了(从数组变成List),目的是连通。
  • 代码上,装饰器类通常叫 SynchronizedXXX、UnmodifiableXXX;适配器类往往藏在工具方法里,比如 Arrays.ArrayList、Collections$EmptyList,不对外暴露构造器。
PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

5579

3

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

2023.10.19

3068

3

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

2025.10.17

4469

12

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2025.12.29

3709

9

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

2026.01.19

406

15

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

5007

5

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.10

2248

6

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

2026.09.30

20

10

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

2026.09.30

40

14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.4万人学习