# 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 用子类覆写实现可变步骤