行为型模式

共 79 题
#

1. Command 模式在 CQRS 写模型中的工程价值,与直接调用 Service 方法相比解决了哪些核心痛点

A 命令与直接调用无区别
B 命令封装为对象,可排队持久化重放审计,解耦调用方与执行方 ✓ 正确答案
C 命令无法持久化
D Command 只用于读模型
#

2. Memento 模式在 Immutable + Event Sourcing 主导的现代架构中还有真实工程价值吗

A Event Sourcing 无需快照
B Memento 完全过时
C Event Sourcing 部分替代快照,但重放成本高,快照仍用于加速恢复与撤销 ✓ 正确答案
D Memento 与快照无关
#

3. Memento 模式在 Spring Cache 与 Redis 持久化快照中的应用与 TTL 失效协作

A 快照存 Redis 并设 TTL 自动失效,配合缓存更新保证数据新鲜 ✓ 正确答案
B 快照无需失效
C Redis 无法持久化快照
D TTL 与快照无关
#

4. Observer 模式与发布订阅消息中间件(Kafka/RabbitMQ)

A 消息中间件是进程内同步
B 二者完全相同
C Observer 是异步跨进程
D Observer 是进程内同步通知,消息中间件是跨进程异步发布订阅,解耦更强 ✓ 正确答案
#

5. Observer 模式的事件发布是否仍需 Synchronized 保护事件源

A 事件发布天然线程安全
B 观察者列表的遍历与修改需同步或用并发容器保护,避免并发修改异常 ✓ 正确答案
C 观察者列表无需保护
D 同步会影响事件正确性
#

6. Servlet Filter 与 WebFlux WebFilter 的责任链在线程模型和异步上下文传播上有何差异

A WebFlux 用 ThreadLocal 传播
B 二者线程模型相同
C Servlet 阻塞线程本地传播上下文,WebFlux 非阻塞用响应式 Context 传播 ✓ 正确答案
D Servlet 是响应式
#

7. Spring 事务事件监听器选择 BEFORE_COMMIT 或 AFTER_COMMIT 时,失败语义和补偿方式有何区别

A AFTER_COMMIT 失败会回滚
B 两者事务边界相同
C BEFORE_COMMIT 失败回滚事务,AFTER_COMMIT 失败不影响已提交事务但需补偿 ✓ 正确答案
D BEFORE_COMMIT 在提交后执行
#

8. Spring 框架中 Strategy 模式与 @Conditional 在 Spring Boot 4.0 自动装配中的角色与协作机制

A 二者互不相关
B @Conditional 按条件决定是否注册,Strategy 决定用哪个实现,实现条件驱动装配 ✓ 正确答案
C @Conditional 决定策略选择
D Strategy 决定是否装配
#

9. Visitor 模式在 Java 编译器(javax.lang.model)

A Visitor 与编译器无关
B Visitor 会把操作写进元素类
C javax.lang.model 用 if-else 判断元素
D ElementVisitor 访问不同元素类型,分离数据结构与操作,新增操作易扩展 ✓ 正确答案
#

10. 使用 Null Object 模式替代 if (obj != null) 在 Spring Bean 注入中的可读性与测试收益

A 判空是唯一的处理方式
B Null Object 无法替代判空
C 用默认实现替代判空,代码可读,测试可注入可预测的默认行为 ✓ 正确答案
D Null Object 使测试更复杂
#

11. 发执行命令时,接收者线程安全与命令对象不可变分别解决什么问题,如何测试

A 并发不影响命令模式
B 命令可不不可变
C 接收者无需线程安全
D 命令不可变解决共享安全,接收者线程安全解决状态一致,用并发测试验证 ✓ 正确答案
#

12. 命令模式在 FutureTask 的应用

A FutureTask 把任务封装为可执行对象,支持异步执行与结果获取,是命令模式 ✓ 正确答案
B FutureTask 只能同步执行
C FutureTask 与命令无关
D FutureTask 无法获取结果
#

13. 命令模式用于消息重试或撤销时,命令对象应如何携带幂等键、授权信息和补偿状态以避免重复副作用

A 命令无需幂等
B 命令应携带幂等键去重、授权信息保证合法、补偿状态支撑恢复 ✓ 正确答案
C 命令无法携带授权信息
D 重试无需去重
#

14. 命令模式(Command)在 CQRS 与 Spring CommandLineRunner 的应用差异

A CQRS 命令是业务写入载体,CommandLineRunner 是启动执行钩子,用途不同 ✓ 正确答案
B 二者完全相同
C CommandLineRunner 是命令总线
D CQRS 命令是启动钩子
#

15. 回调式模板需要管理连接或锁时,如何确保用户函数异常也不会跳过统一资源清理

A finally 只执行成功情况
B 用户回调异常会跳过清理
C 资源清理由用户负责
D 模板用 try/finally 包裹回调,异常也保证释放连接与锁 ✓ 正确答案
#

16. 如何说服团队在合适场景引入策略/责任链等行为型模式而非堆 if-else

A 模式引入无需考虑复杂度
B 所有 if-else 都应替换为模式
C 用具体案例展示 if-else 的维护与测试痛点,说明模式的可扩展性与可测试性收益 ✓ 正确答案
D if-else 永远优于模式
#

17. 模板方法在 AbstractApplicationContext.refresh 的应用

A 模板方法与容器无关
B refresh 无骨架,各子类随意
C 钩子方法不可覆盖
D refresh 定义容器刷新骨架,钩子方法供子类定制,核心流程固定 ✓ 正确答案
#

18. 状态机如何显式阻止非法迁移,并在持久化并发、重复事件和失败重放时保持状态与副作用一致

A 状态机无需阻止非法迁移
B 用迁移表阻止非法迁移,原子更新防并发覆盖,幂等防重复副作用 ✓ 正确答案
C 并发不影响状态
D 重放无需一致性
#

19. 策略链同时包含重试、熔断和超时时,模式组合顺序如何改变总时限与错误可见性

A 顺序无关紧要
B 超时包单次、重试在上、熔断最外,顺序决定总时限与错误可见性 ✓ 正确答案
C 重试总在超时内
D 熔断不依赖异常
#

20. 行为型模式在多线程上下文中的内存可见性与可重入性问题有哪些典型踩坑案例

A 重入可以随意
B 行为型模式天然线程安全
C 可见性与 volatile 无关
D 共享状态未同步导致可见性问题,回调中修改列表导致重入异常 ✓ 正确答案
#

21. 访问者模式在编译器、规则引擎等 AST 场景外的工程价值是否真实存在,哪些被滥用的反模式值得警惕

A 访问者适合数据结构稳定、操作多变的场景,元素易变时滥用会脆弱 ✓ 正确答案
B 访问者适合所有场景
C 元素类型易变时访问者最优
D 访问者总能减少样板
#

22. 责任链中的节点既可能短路也可能继续传播,如何定义顺序、异常处理和幂等约束,保证链行为可预测

A 异常处理随意
B 链无需定义顺序
C 需显式定义顺序、短路语义、异常处理与幂等约束,链行为才可预测 ✓ 正确答案
D 幂等无关紧要
#

23. Iterator 模式在 Java Stream 与 Spliterator 并行流框架下的延迟求值与短路实现细节

A Stream 立即求值
B Spliterator 的按需推进支持延迟求值,分割支持并行,短路提前终止 ✓ 正确答案
C 短路需消费全部元素
D Spliterator 不支持并行
#

24. 枚举策略(Enum Strategy)与 Map 策略注册表在消除分支上的取舍

A 枚举策略类型安全但扩展需改枚举,Map 注册表支持动态扩展更灵活 ✓ 正确答案
B 二者完全相同
C Map 注册表类型安全优于枚举
D 枚举策略支持动态注册
#

25. Mediator 模式在 Spring Cloud 中的 Spring Cloud Bus 与 Spring Cloud Stream 消息协调器角色

A Bus/Stream 作为消息协调器集中分发,降低服务间网状依赖,是中介者模式 ✓ 正确答案
B 二者只做点对点
C 中介者增加网状依赖
D Bus 与服务协调无关
#

26. Null Object 模式在 Kotlin(?类型系统)

A Kotlin 完全替代 Null Object
B Kotlin 类型系统编译期强制处理空值,Null Object 仍提供默认行为语义 ✓ 正确答案
C Kotlin 允许随意空值
D Null Object 与 Kotlin 无关
#

27. Observer 模式在 Spring 的 ApplicationEventPublisher 与 ApplicationListener 中的实现原理

A ApplicationEventPublisher 发布事件,ApplicationListener 监听,Multicaster 分发,解耦发布与监听 ✓ 正确答案
B 发布者需知道监听者
C 监听器不能异步
D 事件机制与观察者无关
#

28. Specification + Repository 模式如何支撑领域规则的单元测试独立演化

A Repository 含业务规则
B 二者必须耦合
C Specification 依赖数据库
D Specification 封装规则、Repository 抽象数据访问,二者分离可独立测试与演化 ✓ 正确答案
#

29. Spring ApplicationEvent 的观察者发布默认可能同步执行,监听器变慢或失败时如何设计异步化、隔离与重试

A 用 @Async 异步化、独立线程池隔离、RetryTemplate 重试,避免同步阻塞与失败丢失 ✓ 正确答案
B 同步发布无风险
C 监听器失败无需重试
D 异步化不需要隔离
#

30. 中介者在 ScheduledExecutorService 的协调

A 中介者与调度无关
B 调度器只是一次性执行
C 任务各自管理线程
D 调度器集中协调多个定时任务的调度,避免各任务各自管理线程 ✓ 正确答案
#

31. 中介者模式(Mediator)与聊天室

A 中介者增加耦合
B 用户直接点对点通信
C 聊天室作为中介者集中转发消息,避免用户间网状依赖 ✓ 正确答案
D 聊天室与中介者无关
#

32. 中介者模式(Mediator)在 MediatR 模式与 Spring 事件总线的工程取舍

A MediatR 偏命令/查询路由,Spring 事件总线偏事件解耦,按架构需求选择 ✓ 正确答案
B 二者完全相同
C MediatR 只做事件广播
D Spring 事件总线做命令路由
#

33. 中介者集中协调组件能降低网状依赖,但中介者膨胀后应按哪些业务协作边界拆分

A 中介者膨胀无需处理
B 所有交互都塞进一个中介者
C 拆分与业务无关
D 按业务协作边界拆成多个中介者,每个只负责一个业务域的协作 ✓ 正确答案
#

34. 从 Java 内置 Observer 退化到 EventListener 的过程中哪些语义被牺牲了

A 语义完全保留
B 牺牲通用自动通知语义,换取更明确、类型安全、面向具体事件的处理 ✓ 正确答案
C EventListener 更通用
D 演进无变化
#

35. 传统的 Mediator 模式如何被消息路由替代

A 消息路由比中介者更耦合
B 消息路由把集中协调升级为分布式消息分发,解耦更强、可扩展 ✓ 正确答案
C 二者完全等价
D 消息路由无法替代中介者
#

36. 传统面向对象的行为型模式是否仍必要,哪些可被高阶函数直接替代

A 模式完全过时
B 所有模式都能被函数替代
C 高阶函数比模式更复杂
D 策略/命令/观察者可用函数式接口替代,但复杂协作仍需模式 ✓ 正确答案
#

37. 使用 Specification 模式(Spring Data JPA Specification)

A 查询条件无法组合
B Specification 只能静态查询
C Specification 封装可组合的查询谓词,支持动态查询与复用 ✓ 正确答案
D Specification 与查询无关
#

38. 使用 Spring 注入 Map<String, Strategy> 构建策略注册表时,如何避免键冲突、缺省实现和条件装配导致的隐患

A 需显式定义键避免冲突、提供缺省实现兜底、明确条件装配避免缺失 ✓ 正确答案
B 键自动唯一无需处理
C 缺省实现无必要
D 条件装配不影响策略注入
#

39. 命令模式支持撤销时,逆操作与状态快照各有什么限制,外部不可逆动作应如何补偿

A 快照能撤销外部副作用
B 逆操作与快照处理内部状态,外部不可逆动作需补偿操作 ✓ 正确答案
C 所有操作都有逆操作
D 外部动作无需补偿
#

40. 命令模式(Command)与 Runnable/Callable

A 二者完全不同
B Runnable/Callable 是命令模式的可执行简化,用于任务执行与异步 ✓ 正确答案
C Runnable 支持撤销
D Callable 不返回结果
#

41. 哪些重构动作可以同时保留扩展性与可读性

A 扩展性必然牺牲可读性
B 提取方法、引入接口、用策略替换 if-else 可同时提升可读性与扩展性 ✓ 正确答案
C 引入抽象总能提升可读性
D 重构与扩展无关
#

42. 备忘录保存完整快照与增量事件各有什么空间和恢复成本,敏感字段又应如何保护

A 敏感字段无需保护
B 完整快照空间小
C 增量恢复快
D 完整快照空间大恢复快,增量空间小恢复慢,敏感字段需脱敏加密 ✓ 正确答案
#

43. 备忘录模式(Memento)与状态快照

A 快照无法恢复
B Memento 不保存状态
C Memento 保存状态快照支持撤销/恢复,并封装状态防止外部篡改 ✓ 正确答案
D Memento 状态可被外部直接修改
#

44. 如何为团队建立行为型模式的评审清单与反模式案例库,使模式引入有据可循

A 模式引入无需评估
B 评审清单评估模式必要性、案例库记录反模式,让模式引入有据可循 ✓ 正确答案
C 反模式无参考价值
D 清单与案例库固化即可
#

45. 如何在小型项目中为可演进性预留抽象空间

A 在真实变化点定义接口、用配置驱动,避免为臆测扩展过度抽象 ✓ 正确答案
B 小型项目不做任何抽象
C 全局抽象更利于演进
D 预留空间越多越好
#

46. 如何用 Chain of Responsibility 模式优雅地实现多阶段(参数校验 → 鉴权 → 配额 → 业务)

A 各阶段封装为链节点,按序传递、失败短路,解耦且可扩展 ✓ 正确答案
B 各阶段必须耦合在一个方法
C 责任链无法处理多阶段
D 阶段顺序不可配
#

47. 如何选择与组合以避免双重拦截

A 多层拦截必然重复
B 明确各层拦截职责边界,让同一关注点只在一层实现,避免重复执行 ✓ 正确答案
C 职责重叠无影响
D 拦截层越多越好
#

48. 如何避免过度设计并以业务复杂度驱动模式引入节奏

A 以业务复杂度为驱动,达到阈值再渐进引入模式并验证收益 ✓ 正确答案
B 一开始就套用所有模式
C 复杂度与模式无关
D 模式引入应超前于需求
#

49. 将多个行为型模式叠加使用时,哪些组合易引发循环依赖与状态不一致,应如何通过分层治理

A 模式叠加无风险
B 按职责分层使依赖单向、集中管理状态,避免循环依赖与状态不一致 ✓ 正确答案
C 循环依赖可忽略
D 状态可被多模式随意修改
#

50. 应如何在不破坏开闭原则的前提下权衡抽象层级

A 所有类都应抽象
B 抽象层级越高越好
C 只在真实变化点抽象,抽象层级与复杂度匹配,避免过度抽象 ✓ 正确答案
D 抽象与 OCP 无关
#

51. 模板方法模式(Template Method)在 Spring JdbcTemplate/RestTemplate 的钩子方法设计

A 模板方法与回调无关
B 模板无变化点
C 回调固定流程
D 模板固定流程,变化点(RowMapper、ResponseExtractor)作为回调注入 ✓ 正确答案
#

52. 模板方法的钩子若能改变核心不变量,为什么说明抽象边界设计有问题,如何重构为组合或策略

A 钩子改变不变量是正常的
B 说明抽象边界错误,应把易变逻辑重构为组合/策略,保留不变量 ✓ 正确答案
C 不变量应被钩子改变
D 模板方法无法重构
#

53. 状态模式在领域驱动设计中与显式状态机(Spring Statemachine)的协作

A 状态模式管迁移,Statemachine 管行为
B 二者完全替代
C 状态机无法阻止非法迁移
D 状态模式封装状态行为,Statemachine 提供显式迁移控制,DDD 中结合保证状态一致 ✓ 正确答案
#

54. 用责任链实现审批流时,规则热更新期间如何保证一个实例始终使用同一版本的链

A 链版本化并让实例在创建时固定版本,更新只影响新实例 ✓ 正确答案
B 更新会改变所有实例
C 热更新无需版本
D 实例随意切换链版本
#

55. 策略模式、状态模式和模板方法都能封装行为时,如何依据变化轴、状态归属和扩展边界做出选择

A 策略管算法替换、状态管状态驱动、模板管流程步骤,按变化轴与状态归属选择 ✓ 正确答案
B 三者完全等价
C 状态随算法变化
D 模板方法管算法替换
#

56. 策略模式与函数式接口 Function<T,R> 在 JDK 8+ 下如何评估抽象成本与可测性的真实差异

A 函数式接口用 Lambda 降低成本,策略类适合复杂策略,按复杂度权衡 ✓ 正确答案
B 函数式接口成本更高
C 策略模式不可测
D 二者无差异
#

57. 策略模式在 Spring @Profile 的应用

A 所有环境使用同一策略
B @Profile 与策略无关
C @Profile 按环境激活不同策略 Bean,实现按环境选择策略 ✓ 正确答案
D @Profile 无法区分环境
#

58. 策略模式(Strategy)与 Comparator 的应用

A 排序策略固定不可换
B Comparator 与排序无关
C Comparator 是策略接口,排序传入不同比较策略改变行为 ✓ 正确答案
D Comparator 是模板方法
#

59. 行为型模式如何与可配置化策略中心协作以减少硬编码分支

A 策略与配置无关
B 策略中心按配置选择策略、行为型模式提供执行结构,配置驱动减少硬编码分支 ✓ 正确答案
C 策略中心增加硬编码
D 协作无法减少分支
#

60. 行为型模式如何被 Event Sourced Aggregate 重新表达

A 命令与事件无关
B 事件溯源无事件
C 行为仍直接改状态
D 命令产生事件、状态由事件推导,行为被事件化表达 ✓ 正确答案
#

61. 观察者模式在 Spring Modulith 模块事件(@ApplicationEventListener)

A 模块发布领域事件,@ApplicationModuleListener 监听,模块间解耦 ✓ 正确答案
B 模块必须直接调用
C 事件无法跨模块
D Modulith 与观察者无关
#

62. 观察者模式与发布-订阅(消息总线)在耦合度与异步性上的差异

A 观察者持有观察者引用、同步高耦合,发布订阅经总线解耦、异步低耦合 ✓ 正确答案
B 二者耦合度相同
C 观察者是异步的
D 发布订阅同步且高耦合
#

63. 命令模式与消息队列的相似性,将请求封装为可排队、可重放的对象

A 消息无法重放
B 命令无法排队
C 二者都把请求封装为可排队、可重放的对象,命令是进程内、消息是分布式 ✓ 正确答案
D 二者无相似性
#

64. 观察者模式(Observer)与 Spring 事件

A 观察者模式是 Spring 的专有
B Spring 事件与观察者无关
C Spring 事件只能同步
D Spring 事件是观察者模式的工程实现,支持异步、事务与泛型事件 ✓ 正确答案
#

65. 解释器模式执行用户提供的 SpEL 或规则表达式时,如何限制语法、函数、反射能力和资源消耗以防注入

A 外部表达式可自由执行
B 需限制语法白名单、禁用反射与危险函数、限制长度与超时防注入 ✓ 正确答案
C 反射无需限制
D 资源消耗无所谓
#

66. 解释器模式(Interpreter)与表达式求值

A 复杂表达式手写解释器最佳
B 解释器适合所有语法
C 表达式求值无语法树
D 表达式解析为语法树并递归求值,适合简单语法,复杂场景用现成引擎 ✓ 正确答案
#

67. 访问者模式便于新增操作却增加新增节点成本,结合 Java 25 密封类型和模式匹配 switch 时如何权衡

A switch 无法替代访问者
B 密封类型无法穷尽检查
C 密封类型 + switch 新增操作只需加 case,且穷尽性编译期可查,可替代访问者 ✓ 正确答案
D 访问者新增节点成本低
#

68. 访问者模式(Visitor)与 AST 遍历

A Visitor 遍历 AST 各节点并分离操作,适合节点类型固定、操作多变的场景 ✓ 正确答案
B AST 遍历需改节点类
C 访问者与 AST 无关
D 新增操作需改所有节点
#

69. 访问者遍历可变 AST 时,边遍历边改写会破坏哪些假设,如何采用不可变重写结果

A 边遍历边改写安全
B 改写破坏遍历顺序与结构一致,用不可变重写返回新树避免副作用 ✓ 正确答案
C 不可变重写无法实现
D 改写不影响遍历
#

70. 请用具体业务场景说明,命令模式与事件驱动在审计追溯、重放与可观测性上如何互补

A 命令用于重放状态
B 命令与事件互斥
C 事件用于审计操作
D 命令记录操作意图、事件记录状态变化可重放,trace 串联实现审计与可观测 ✓ 正确答案
#

71. 责任链在 Resilience4j 的应用

A 组合顺序无影响
B 容错组件独立运行
C 熔断、限流、重试等装饰器组合成链,请求按序经过各容错组件 ✓ 正确答案
D Resilience4j 与责任链无关
#

72. 责任链模式在 Spring WebFlux WebFilter 与 Servlet Filter 链的应用

A WebFlux 链不能异步
B 二者都同步
C 二者都是责任链,Servlet 同步阻塞、WebFlux 响应式异步传递 ✓ 正确答案
D 责任链与 Filter 无关
#

73. 迭代器包装数据库游标时,短路遍历、异常和 close 应如何协作,才能避免连接泄漏和重复关闭

A close 可重复随意调用
B 只有正常到尽头才关闭
C 异常时无需关闭
D 短路、异常、提前退出都需关闭,统一关闭且 close 幂等避免泄漏与重复关闭 ✓ 正确答案
#

74. 迭代器模式(Iterator)与 Iterator/Spliterator

A Spliterator 不支持分割
B 二者完全相同
C Iterator 顺序遍历,Spliterator 支持分割与并行遍历 ✓ 正确答案
D Iterator 支持并行
#

75. 选择行为型模式时,如何用变化轴、调用方向和生命周期判断,而不是按类图机械套用

A 变化轴与选型无关
B 按类图套用即可
C 用变化轴、调用方向、生命周期判断,而非机械套用类图 ✓ 正确答案
D 生命周期不需考虑
#

76. JEP 485 Stream Gatherers 与传统 Iterator/Spliterator 在中间状态、窗口聚合和并行处理方面有何差异

A 它只能做无状态操作
B 它支持有状态中间操作与窗口聚合,且集成 Stream 的并行处理 ✓ 正确答案
C 与传统 Iterator 相同
D 不支持并行
#

77. 观察者在 java.util.Observable(已弃用)与 PropertyChangeListener

A PropertyChangeListener 已弃用
B Observable 仍推荐
C Observable 已弃用,PropertyChangeListener 提供属性级监听,是现代替代之一 ✓ 正确答案
D 二者相同
#

78. 访问者模式(Visitor)在 JDK 25 模式匹配与 Java AST 处理(如 JavaParser)

A JavaParser 不用 Visitor
B 模式匹配无法处理 AST
C JavaParser 用 Visitor 遍历 AST,模式匹配 switch 可补充类型分支处理 ✓ 正确答案
D AST 节点类型易变
#

79. 责任链在日志框架(Logger 层级与 Appender 链)中的应用

A Logger 无层级
B 日志只输出一次到固定位置
C Logger 层级传播与 Appender 链按序处理日志,是责任链思想 ✓ 正确答案
D Appender 不能组合