结构型与行为型高频

共 19 题
#

1. 策略模式与状态模式结构几乎相同,意图差异是什么?各自的典型业务场景?

A 两者意图完全相同,只是命名不同
B 策略模式有状态迁移关系
C 状态模式用于替换算法,与状态无关
D 策略由客户端选择算法,状态由状态迁移驱动行为变化 ✓ 正确答案
#

2. 观察者模式与发布-订阅模式的区别中有无 Broker、耦合度与失败传播行为?

A 观察者模式中一个观察者失败不影响其他观察者
B 观察者模式通过 Broker 中转消息
C 发布-订阅通过 Broker 中转,发布者与订阅者完全解耦 ✓ 正确答案
D 发布-订阅中发布者直接知道订阅者
#

3. 装饰器模式与代理模式的结构与意图差异?动态代理(JDK/CGLIB)与代理模式的关系?

A 装饰器增强功能且透明,代理控制访问且非透明 ✓ 正确答案
B 装饰器用于控制访问,代理用于增强功能
C 动态代理是装饰器模式的实现
D 两者在意图上完全相同
#

4. 模板方法模式与策略模式在"复用算法骨架"上的互补关系?钩子方法的设计要点?

A 模板方法复用算法骨架(继承),策略替换算法(组合),二者互补 ✓ 正确答案
B 模板方法基于组合替换算法
C 钩子方法是必须实现的方法
D 策略模式复用算法骨架
#

5. 代理模式 vs 装饰器模式中职责不同(控制访问 vs 增强功能),在 AOP/缓存中的应用?

A 两者职责完全相同
B 代理增强功能,装饰器控制访问
C AOP 用装饰器模式实现
D 代理控制访问(AOP 拦截),装饰器增强功能(叠加日志缓存) ✓ 正确答案
#

6. 迭代器与组合模式中如何统一容器遍历接口并支持递归结构?

A 组合模式只能处理叶子,不能组合
B 迭代器只能遍历线性结构
C 迭代器统一遍历接口,组合模式支持递归结构,组合迭代器可递归遍历树 ✓ 正确答案
D 组合模式与迭代器无关
#

7. 你在实际项目中如何用策略模式消除 if-else 分支?结合支付/营销/计费场景说明重构步骤、策略注册表与测试收益?

A 新增策略需要修改已有策略类
B 策略模式仍然依赖 if-else 判断
C 用策略注册表按类型查找策略,消除 if-else 并符合开闭 ✓ 正确答案
D 策略模式让测试更复杂
#

8. Spring/主流框架中大量使用了哪些设计模式?举出 AOP(动态代理)、IoC(工厂)、事件监听(观察者)、拦截器(责任链)、JdbcTemplate(模板方法)等实例

A Spring 的 IoC 容器是单例模式而非工厂
B Spring 用动态代理实现 AOP,用事件监听实现观察者,用 Template 实现模板方法 ✓ 正确答案
C Spring 拦截器是观察者模式
D JdbcTemplate 是代理模式
#

9. 责任链模式在过滤器链/拦截器/审批流中的应用与纯/不纯责任链差异?

A 过滤器链中每个过滤器要么处理要么终止,不会传递
B 纯责任链只有一个处理器处理,不纯责任链可处理又传递给多个 ✓ 正确答案
C 责任链模式无法动态组合处理器
D 纯责任链允许多个处理器处理同一请求
#

10. 适配器、桥接、外观三者的意图辨析中分别解决什么维度的适配问题?

A 外观做接口转换
B 三者的目的完全相同
C 桥接做接口转换,适配器分离抽象与实现
D 适配器做接口转换,桥接分离抽象与实现,外观提供统一入口 ✓ 正确答案
#

11. 享元模式与对象池的区别?Integer 缓存是享元吗?

A 对象池共享不可变内部状态
B 享元共享不可变内部状态,Integer 缓存是享元;对象池复用可借还对象 ✓ 正确答案
C Integer 缓存是对象池
D 享元与对象池机制完全相同
#

12. 策略模式 vs 状态模式中算法替换 vs 状态迁移,如何避免 if-else 爆炸?

A 状态模式用于替换算法
B 两者都用 if-else 判断
C 策略替换算法(外部选择),状态随状态迁移变化(内部驱动),都用多态消除 if-else ✓ 正确答案
D 策略模式有状态迁移
#

13. 适配器 vs 外观中接口转换 vs 统一入口,第三方库封装时的选择?

A 两者完全等价
B 适配器为子系统提供统一入口
C 外观做接口转换
D 适配器做接口转换,外观为复杂子系统提供统一简化入口 ✓ 正确答案
#

14. 中介者模式(Mediator)如何把多对多的对象交互集中到单一中介者,以聊天室/航班调度为例,同事类为何只依赖中介者接口,中介者膨胀为'上帝对象'时如何权衡,与观察者/发布-订阅的差异?

A 中介者与发布-订阅完全相同
B 同事类之间直接互相引用
C 中介者集中多对多交互,同事类只依赖中介者接口,但易膨胀为上帝对象 ✓ 正确答案
D 中介者膨胀不可避免,无需拆分
#

15. 备忘录模式(Memento)如何在不破坏封装的前提下实现撤销,Originator 生成快照、Caretaker 保存与恢复的三角协作,为何窄/宽接口设计(仅 Originator 可访问内部状态)是封装关键,与命令模式组合实现多级撤销的代价?

A 备忘录模式暴露对象内部状态
B Caretaker 可以直接访问 Memento 内部状态
C Originator 生成快照、Caretaker 保存与恢复,窄/宽接口保证只有 Originator 访问内部状态 ✓ 正确答案
D 多级撤销无需保存快照
#

16. 观察者模式与 Spring 事件机制中@EventListener 如何实现发布订阅,异步监听器的事务边界、异常与回滚语义?

A 异步监听器与发布者共享同一事务
B 同步监听器参与发布者事务,异常可能回滚;异步监听器独立事务边界 ✓ 正确答案
C 监听器异常总是回滚发布者事务
D @EventListener 无法实现异步监听
#

17. 责任链模式在 SpringMVC 拦截器/过滤器链中的执行顺序与终止机制,与 AOP 切面的差异?

A 过滤器在业务方法之后执行
B AOP 切面作用在请求级,与拦截器同级
C 拦截器 postHandle 按注册顺序执行
D 过滤器在拦截器之前执行,拦截器 preHandle 返回 false 可终止 ✓ 正确答案
#

18. 观察者模式与发布-订阅中同步/异步通知、事件总线与内存泄漏(未解绑)问题?

A 同步通知不阻塞发布者
B 未解绑的订阅者可能被强引用持有,造成内存泄漏 ✓ 正确答案
C 事件总线无法异步分发
D 订阅者永远不需要取消订阅
#

19. 模板方法模式在框架基类(如 JdbcTemplate 的回调模板)中的应用,为什么回调比子类覆写更灵活?

A 回调必须继承框架基类
B 回调基于组合注入可变逻辑,比子类覆写更灵活、可复用 ✓ 正确答案
C 子类覆写比回调更灵活,无需继承
D JdbcTemplate 用子类覆写实现可变步骤