当前位置: 首页 > news >正文

面试官最爱问的设计题:动态支付系统设计(策略模式 + 工厂模式 + Spring自动注册)

在 Java 面试中,有一道非常经典的面向对象设计题

如何设计一个支持多种支付方式的支付系统

例如:

  • 支付宝

  • 微信

  • 银行卡

  • Apple Pay

  • 未来可能新增更多支付方式

很多面试者第一反应就是写if-else,但这其实是一个典型的设计模式题

这道题主要考察:

  • 面向对象设计(OOP)

  • 设计模式(Strategy + Factory)

  • 系统可扩展性

  • Spring IOC理解

本文将从错误实现 → 设计模式 → Spring优化 → 面试回答一步一步讲清楚。


一、业务场景

假设我们在开发一个电商系统。

用户发起支付请求:

POST /pay { "orderId": 123, "payType": "ALIPAY" }

系统需要根据payType调用不同支付逻辑:

ALIPAY -> AliPayService WECHAT -> WechatPayService BANK -> BankPayService

二、最常见的错误实现(if-else)

很多人会这样写:

public void pay(String payType) { if(payType.equals("ALIPAY")){ aliPay(); }else if(payType.equals("WECHAT")){ wechatPay(); }else if(payType.equals("BANK")){ bankPay(); } }

问题非常明显:

1 违反开闭原则

如果新增支付方式:

ApplePay

必须修改代码:

else if(payType.equals("APPLEPAY")){ applePay(); }

2 if-else 会越来越多

如果未来有100种支付方式

巨型 if-else

代码会变得:

  • 难维护

  • 难扩展

  • 难测试


三、正确思路:策略模式

策略模式核心思想:

将不同的算法封装成独立的策略类,在运行时选择。

在这个系统中:

不同支付方式 = 不同策略

四、策略模式结构

系统结构:

PaymentStrategy ↑ ┌────────┼────────┐ AliPay WechatPay BankPay

五、实现策略模式

1 定义支付接口

public interface PaymentStrategy { void pay(Order order); }

2 实现不同策略

支付宝

public class AliPay implements PaymentStrategy { @Override public void pay(Order order) { System.out.println("支付宝支付"); } }

微信支付

public class WechatPay implements PaymentStrategy { @Override public void pay(Order order) { System.out.println("微信支付"); } }

银行卡支付

public class BankPay implements PaymentStrategy { @Override public void pay(Order order) { System.out.println("银行卡支付"); } }

六、如何动态选择策略?

现在的问题是:

payType = "ALIPAY"

如何获取:

AliPay

这时候需要:

工厂模式


七、工厂模式

工厂模式的作用:

统一管理对象的创建过程

而不是在业务代码中:

new AliPay()

支付工厂

public class PaymentFactory { private static Map<String, PaymentStrategy> strategyMap = new HashMap<>(); static { strategyMap.put("ALIPAY", new AliPay()); strategyMap.put("WECHAT", new WechatPay()); strategyMap.put("BANK", new BankPay()); } public static PaymentStrategy getStrategy(String payType){ return strategyMap.get(payType); } }

八、业务调用

public class PaymentService { public void pay(String payType, Order order){ PaymentStrategy strategy = PaymentFactory.getStrategy(payType); strategy.pay(order); } }

执行流程:

用户请求 ↓ PaymentService ↓ PaymentFactory ↓ 获取策略对象 ↓ 执行支付逻辑

九、系统架构图

完整结构:

PaymentStrategy ↑ ┌─────┼─────┐ AliPay WechatPay BankPay ↑ PaymentFactory ↑ PaymentService

职责划分:

组件职责
PaymentStrategy定义支付接口
AliPay具体策略
WechatPay具体策略
PaymentFactory创建策略
PaymentService业务调用

十、为什么这种设计更好?

1 符合开闭原则

新增支付方式:

ApplePay

只需要:

新增一个策略类

无需修改原有代码。


2 降低耦合

业务代码:

PaymentService

不需要知道具体实现:

AliPay WechatPay

3 可扩展

未来可以轻松增加:

  • 日志

  • 风控

  • 限流

  • 监控


十一、大厂面试追问:100种支付方式怎么办?

如果支付方式很多:

static { strategyMap.put("ALIPAY", new AliPay()); strategyMap.put("WECHAT", new WechatPay()); strategyMap.put("BANK", new BankPay()); strategyMap.put("APPLEPAY", new ApplePay()); strategyMap.put("UNIONPAY", new UnionPay()); }

问题:

  • 工厂类越来越大

  • 每新增策略都要修改工厂

  • 违反开闭原则


十二、企业级解决方案:Spring 自动注册策略

在 Spring 项目中,可以利用IOC容器自动注入策略

目标:

新增策略类 ↓ 系统自动识别 ↓ 无需修改代码

1 定义策略接口

public interface PaymentStrategy { String getPayType(); void pay(Order order); }

2 实现策略

@Component public class AliPayStrategy implements PaymentStrategy { @Override public String getPayType() { return "ALIPAY"; } @Override public void pay(Order order) { System.out.println("支付宝支付"); } }

3 自动注入策略

@Service public class PaymentService { private Map<String, PaymentStrategy> strategyMap = new HashMap<>(); @Autowired public PaymentService(List<PaymentStrategy> strategies){ for(PaymentStrategy strategy : strategies){ strategyMap.put(strategy.getPayType(), strategy); } } public void pay(String payType, Order order){ PaymentStrategy strategy = strategyMap.get(payType); strategy.pay(order); } }

Spring 会自动注入:

AliPayStrategy WechatPayStrategy BankPayStrategy ...

十三、最终系统结构

PaymentStrategy ↑ ┌─────┼─────┬─────┐ AliPay WechatPay BankPay ... Spring IOC ↓ List<PaymentStrategy> ↓ Map<String,Strategy>

十四、面试回答模板

如果面试官问:

如何设计动态支付方式?

可以回答:

我会使用策略模式封装不同的支付方式,每种支付方式实现统一的支付接口,例如 AliPay、WechatPay。
然后使用工厂模式根据 payType 获取对应策略对象。
在实际项目中,如果支付方式很多,可以结合 Spring IOC 自动注入策略类,避免维护大量 map.put(),提高系统扩展性。


十五、总结

这道题核心考察:

  • 面向对象设计(OOP)

  • 策略模式

  • 工厂模式

  • Spring IOC

  • 系统扩展能力

最终设计:

策略模式 + 工厂模式 + Spring IOC
http://www.jsqmd.com/news/485274/

相关文章:

  • Python每日一题:四道易错题深度解析(变量作用域、逻辑运算、lambda、Py2/3区别)
  • OpenClaw玩转有道云笔记
  • 超越 Transformer 的架构前瞻
  • 2026年手机摄像头测试方案厂商技术强的品牌推荐 - mypinpai
  • 网络安全向日葵漏洞
  • 学长亲荐 8个降AIGC软件:全行业通用测评,帮你高效降AI率
  • java从头开始-苍穹外卖-day11-数据统计与展示
  • Argo CD 的核心架构组件与作用
  • js 从入门到放弃 3/15
  • 语音算法面试复习系列2——语音信号处理基础(下)
  • Vue案例——面经
  • 图解C语言侵入式双向循环链表与 container_of 宏底层原理
  • 百度文心搜索4.0+C# RAG实战:打造支持实时问答与长文档总结的智能客服
  • 计算机毕业设计springboot基于Spark的用户行为数据挖掘与分析解决方案 SpringBoot框架下融合Spark的用户行为模式识别与智能分析平台 基于SpringBoot与Spark的用户行
  • lossless-claw vs mem0:别再把上下文管理和长期记忆混为一谈
  • JAVA面试题速记-分布式架构知识点-元一软件
  • 2.创建你的第一个FreeRTOS任务(动态与静态)
  • 项目实训开题
  • Three.js制作的3D魔方。
  • 0612-出租车(调价+昼夜)-系统设计(51+SEG+DS1302)
  • TimeLine如何自定义轨道
  • 035-spiderbuf第C12题
  • 嘎嘎降AI和笔灵AI哪个好?花200块实测对比告诉你
  • 手把手教你用嘎嘎降AI处理毕业论文:从上传到下载全流程 - 我要发一区
  • 计算机毕业设计java基于个性化推荐的众筹系统 基于用户画像的智能众筹平台的设计与开发 融合个性化推荐机制的创意项目融资系统的构建与实现
  • 品牌设计集团如何选择?
  • 基于SpringCloud的电子商城系统设计与应用
  • 2026年知网最新AIGC检测算法应对攻略 - 我要发一区
  • InnoDB中的undo日志和历史系统的基础机制
  • 四轮驱动汽车的线控转向系统失效+轨迹跟踪和横摆稳定性、失效容错控制仿真(带复现参考文献)