Java集合类广泛应用迭代器、工厂、装饰器和适配器四种设计模式:迭代器分离遍历逻辑与集合实现;工厂方法封装实例创建;装饰器通过包装动态增强功能;适配器桥接数组与List接口。

Java集合类的设计模式不是抽象理论,而是每天写代码时就在用的实践工具。理解它们的关键,是看清楚“谁在做什么”——集合负责存数据,而设计模式负责把访问、创建、包装、转换这些动作分离开,让每部分职责清晰、可替换、不耦合。
迭代器模式:遍历逻辑和集合实现彻底分开
你写 for (String s : list) 或者手动调用 iterator().next(),背后就是迭代器模式在工作。ArrayList 和 LinkedList 都实现了 List 接口,但内部结构完全不同(数组 vs 双向链表),它们各自提供专属迭代器(Itr 和 ListItr),却都遵守同一个 Iterator 接口规范。
好处很明显:
- 客户端不用记“ArrayList 用索引、LinkedList 别用索引”,统一用
hasNext()/next() - 想加个倒序遍历?写个
ReverseIterator就行,不影响原有集合类 - 遍历时删元素出错(ConcurrentModificationException)?那是迭代器自带的 fail-fast 检查,属于它自己的职责,不是集合该管的事
工厂模式:集合实例创建交给静态方法封装
不需要每次都 new ArrayList(),Collections 工具类提供了语义明确的工厂方法:
-
Collections.singletonList("a")→ 创建只含一个元素的不可变 List -
Collections.unmodifiableSet(set)→ 包装成只读视图,不复制数据 -
Map.entry("k", "v")(JDK 9+)→ 快速构造轻量 Entry,比new AbstractMap.SimpleEntry更简洁
这些方法隐藏了具体实现类(比如 SingletonList 是私有静态内部类),也避免了用户误用可变集合造成线程或安全问题。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
装饰器模式:给集合动态加能力,不改原始对象
想让一个普通 List 变成线程安全的?或者禁止修改?不用继承、不用重写,直接包装:
-
Collections.synchronizedList(list)→ 返回一个新对象,所有方法加了synchronized -
Collections.unmodifiableList(list)→ 返回代理对象,调add()直接抛UnsupportedOperationException
这种“套壳”方式符合开闭原则:原始集合不变,功能增强靠组合,还能多层叠加(比如先只读再同步)。
适配器模式:让不兼容的接口能一起工作
最典型的就是 Arrays.asList(arr)。传入一个普通数组(T[]),返回一个 List 接口实例。这个返回值不是新拷贝的 ArrayList,而是一个内部适配器类(Arrays.ArrayList),它把数组的操作转译成 List 的行为。
注意点:
- 它不支持
add()、remove()—— 因为底层数组长度固定 - 修改适配器 List,会直接影响原数组;反之亦然
- 这不是 bug,是适配器的本意:桥接两种结构,共享数据而非复制
不复杂但容易忽略

















