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

面试官最爱问的设计题:动态支付系统设计(策略模式 + 工厂模式 + 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

相关文章:

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

在 Java 面试中,有一道 非常经典的面向对象设计题:如何设计一个 支持多种支付方式的支付系统?例如:支付宝微信银行卡Apple Pay未来可能新增更多支付方式很多面试者第一反应就是写 if-else,但这其实是一个 典型的设计模…...

部署RHCSA9.7、并完成优化

一、建立虚拟机 1、初步建立 (1)点击创新的虚拟机 (2)点击自定义----下一步 (3)点击稍后安装操作系统----下一步 (4)点击Linux(L)----版本选择(…...

分享一款高颜值强大的uniapp组件库-图鸟组件库

图鸟UI是一套基于uni-app的组件库,提供了丰富的UI组件和完整的页面模板,可以帮你快速搭建小程序、H5或App。下面整理了官方模板和社区资源的入口,方便你直接选用。 🎨 官方模板系列 图鸟官方提供了多种场景的完整模板&#xff0…...

深度探讨:从 OpenClaw 爆火,看 AI Agent 的真相与程序员的未来

导语: 近期,以 OpenClaw 为代表的自主智能体(Autonomous Agent)火爆技术圈。这些宣称能“完全接管电脑、自主写代码”的 AI 到底有多神?在狂热的炒作背后,技术落地的真相是什么?AI 真的要干掉程…...

AI博主实测|2026最新PPT工具合集,覆盖全场景,告别熬夜手搓

一、引言作为常年和PPT打交道的AI博主,每天都会收到粉丝提问:“做PPT用什么工具高效?”“AI能帮我快速做PPT吗?”“新手零基础,哪款工具最容易上手?”其实PPT工具没有“最好”,只有“最适配”—…...

原生Windows安装OpenClaw

前言 根据OpenClaw官方文档,Windows下安装其实是推荐WSL2,但我的电脑上没有提前装Linux虚拟机,又只是想先快速体验一下OpenClaw,因此就原生Windows安装了。 部署前准备 官方文档中,有几种安装方式。 方式一 通过在W…...

02-Agent 智能体开发实战指南(二):工具调用系统

Agent 智能体开发实战指南(二):工具调用系统深度解析 系列导读:这是《Agent 智能体开发实战指南》系列的第二篇,将深入讲解 Agent 的工具调用系统,包括tool 装饰器原理、工具设计原则、多工具协作等核心内容…...

AI大模型课程|非计算机专业转行人工智能,好就业吗?非常详细收藏我这一篇就够了

很多就业者在看到人工智能领域发展的很好,意识觉醒的人想进入这个行业里面得到一些新兴行业的红利,想转行却担心自己的经历或者是专业被卡,犹豫不决,今天就来和大家聊一聊这个话题,看看能不能解除你的疑惑。 01写在前面…...

2026春招AI人才暴涨12倍!高薪缺人,企业招聘“去初级化”,脉脉洞察求职新趋势!

近日,职场社区平台脉脉发布《社交求职——2026年1-2月中高端人才求职招聘洞察》(以下简称《洞察》)。《洞察》显示,2026年1-2月,招聘市场整体回暖。新经济行业岗位量增长12.77%。AI人才争夺成招聘主战场,岗…...

OpenClaw深度解析:AI Agent运作机制全拆解,揭秘智能边界与安全风险!

本课以 OpenClaw 为具体案例,系统拆解 AI Agent 的完整运作机制。核心逻辑链为:LLM文字接龙本质 → System Prompt驱动的身份认知构建 → Tool Call工具链执行(Read/Write/exec/TTS/ASR递归调用)→ Sub-agent层级外包与Context En…...

Coursera 6 大 AI 爆款课深度评测!告别理论堆砌,初级开发者也能秒懂选课攻略,简历瞬间加分!

市面上 AI 课程一大堆,但要么太理论,要么太基础。本文对 Coursera 上 6 门优质 AI 课程进行了评测,结合国内初级开发者视角,帮你看懂各课程适合什么人、侧重点是什么,以及如何按自己的起点与目标做出选课决策。导语 想…...

ebmap Tour 智慧节目时间表功能预览

ebmap Tour 最近新增了节目时间表功能,为景区 / 园区打造实时化、场景化的演艺活动管理与展示体系,让游客清晰掌握节目动态、合理规划游览路线,同时帮助运营方高效编排、精准触达游客,提升景区服务体验与活动曝光。安装扩展&#…...

约瑟夫环(代码+公式推导)

题目描述𝑛个人的编号是 1 ~ 𝑛,如果他们依编号按顺时针排成一个圆圈,从编号是 1 的人开始顺时针报数。(报数是从 1 报起)当报到 𝑘的时候,这个人就退出游戏圈。下一个人重新从 1 开…...

图解C语言侵入式双向循环链表与 container_of 宏底层原理

一、侵入式链表 在了解侵入式链表之前,先回顾之前的非侵入式链表,形式如下: struct Node {int data; // 数据struct Node* next; };在非侵入式链表的这种设计中,拿到一个 Node,顺便也就拿到了它的 data。 …...

java从头开始-苍穹外卖-day11-数据统计与展示

营业额统计用户统计订单统计销量排名top10这个其实要多表联查,菜品是在订单详情表,但是这个表没有订单完成状态,因此需要多表连查...

别让Service层“越界”:为何Java中Service层不该直接返回Result对象?

别让Service层“越界”:为何Java中Service层不该直接返回Result对象? 引入:一次代码审查引发的思考 昨天在进行代码审查的时候,我发现同事在 Service 层直接返回了 Result 对象。当时我就指出了这个问题,可同事一脸疑惑…...

基于Spring Boot的校园二手物品置换系统设计与实践

第一章:系统设计目标与需求拆解 在高校倡导绿色低碳理念与学生闲置物品处理需求增长的背景下,基于Spring Boot的校园二手物品置换系统,核心目标是构建“以物换物”的非货币交易平台,解决传统校园二手交易中“价格博弈繁琐、闲置物…...

基于SpringBoot+Vue的旅游信息咨询网站

第一章:网站设计背景与核心定位 在旅游消费升级的趋势下,用户对旅游信息的需求从“基础查询”转向“精准化、个性化、一站式”服务,传统旅游信息平台存在信息碎片化、更新滞后、互动性弱等问题——用户需在多个平台切换查询景点、住宿、交通信…...

大学C语言搜题app推荐,助你从小白变编程大牛

不少自学C语言的同学都碰到过这般困境,看书之际觉着自己懂了,然而一敲代码便两眼一抹黑,碰到报错也不清楚如何解决。实际上,要想切实掌握这门底层语言,仅仅啃书本远远不足够,借助手机上的工具随时开展练习、…...

C语言特点及应用领域介绍,面向过程语言的相关知识

拥有50年历史的老牌编程语言C语言,直至如今在嵌入式开发领域依旧稳稳占据着霸主位置,每年毕业的程序员数量成千上万,然而真正能够把C语言运用到关键之处的却并不多。它具备简单直接的面向过程特性,在资源受到限制的单片机上面&…...

MCP、RAG与AI智能体对比图文笔记:收藏这份入门指南,轻松掌握大模型核心技术方向!

核心概念:各司其职的技术方向当前AI领域最火的三个概念(MCP、RAG、AI智能体),本质上解决的是不同层面的问题,并非互斥竞争关系。以下是它们的定位差异:技术方向核心能力解决的核心问题MCP定义LLM如何使用外…...

技术深度:模型预测控制(MPC)储能控制策略与多目标哈里斯鹰(MOHHO)算法储能容量配置研究

模型预测控制(MPC)储能控制策略 多目标哈里斯鹰(MOHHO)算法储能容量配置 matlab 研究内容:控制策略为双层控制模型,上层储能补偿风电预测误差,下层储能利用MPC平抑风电功率波动。 配置模型嵌入了上述控制策略&#xf…...

Docker 核心知识点

一、Docker 是什么Docker 把应用 依赖 环境一起打包,放到一个轻量、隔离、可移植的容器里,在哪都能跑。二、3 个核心概念1. 镜像(Image)- 只读模板 - 相当于「安装包」「系统盘」- 例:nginx、centos、tomcat2. 容器…...

什么是 SMD 封装?是不是都不带引脚?

SMD Surface Mounted Device中文:表面贴装器件,就是直接贴在 PCB 板表面焊接的元器件,不是从孔里穿过去焊的那种。1. 是不是都不带引脚?不是绝对 “没有引脚”,而是没有长直插引脚。SMD 有两种典型结构:无…...

C++——数组类模板

1.模板参数可以是数值型参数&#xff08;非类型参数&#xff09;模板参数是在编译阶段被处理的单元&#xff0c;所以在编译阶段必须准确无误的唯一确定变量、浮点数、类对象不能作为模板参数示例&#xff1a;使用模板参数计算12...N#include <iostream> #include<stri…...

来晚了,最全openClaw 本地部署安装方式!(Mac 和 windows)

大家好&#xff0c;我是阿陆&#xff01; 最近哥们不是在面试嘛。面试都面到老板面了&#xff0c;结果老板问了一句&#xff0c;你有玩过openClaw嘛&#xff0c;我说没有。好家伙&#xff0c;这一句话一出来当场变脸。 后续不出所料&#xff0c;老板面没有通过。 我心里想着吃一…...

Dying Gasp IC 详解:定义、功能、选型参数与应用场景

引言在通信设备&#xff08;如 GPON ONU、xDSL Modem、工业网关&#xff09;的实际应用中&#xff0c;突然掉电可能导致设备状态丢失、网管无法定位故障等问题。Dying Gasp&#xff08;临终之息&#xff09;技术正是为解决这一痛点而生&#xff0c;而Dying Gasp IC作为该技术的…...

变异检测算法解析:GATK、Samtools、DeepVariant的原理与性能对比

点击 “AladdinEdu&#xff0c;你的AI学习实践工作坊”&#xff0c;注册即送-H卡级别算力&#xff0c;沉浸式云原生集成开发环境&#xff0c;80G大显存多卡并行&#xff0c;按量弹性计费&#xff0c;教育用户更享超低价。 摘要&#xff1a;变异检测是全基因组/全外显子组测序数…...

从对话到协作:深度解析 WebMCP —— 开启浏览器端的 AI 智能体新时代

在 2024 年底&#xff0c;Anthropic 推出了 MCP (Model Context Protocol)&#xff0c;试图为 AI 模型与外部数据源之间构建一条“通用数据总线”。然而&#xff0c;对于广大的前端开发者和 Web 生态来说&#xff0c;传统的 MCP 更多是在后端或桌面端发力。 2025 年初&#xf…...

java基础面试知识点

java基础 1. Java面试核心概念 Java三大特点 &#xff1a;平台无关性、面向对象、内存管理。 平台无关性&#xff1a;通过JVM&#xff08;Java虚拟机&#xff09;实现。源代码编译成字节码&#xff08;.class文件&#xff09;&#xff0c;可在任何安装了相应JVM的操作系统上运行…...