面试官最爱问的设计题:动态支付系统设计(策略模式 + 工厂模式 + 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 MapString, 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 WechatPay3 可扩展未来可以轻松增加日志风控限流监控十一、大厂面试追问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 MapString, PaymentStrategy strategyMap new HashMap(); Autowired public PaymentService(ListPaymentStrategy 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 ↓ ListPaymentStrategy ↓ MapString,Strategy十四、面试回答模板如果面试官问如何设计动态支付方式可以回答我会使用策略模式封装不同的支付方式每种支付方式实现统一的支付接口例如 AliPay、WechatPay。然后使用工厂模式根据 payType 获取对应策略对象。在实际项目中如果支付方式很多可以结合 Spring IOC 自动注入策略类避免维护大量 map.put()提高系统扩展性。十五、总结这道题核心考察面向对象设计OOP策略模式工厂模式Spring IOC系统扩展能力最终设计策略模式 工厂模式 Spring IOC
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2416095.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!