核心内容摘要
BERT中文分段镜像应用场景:从会议记录到讲座文稿的全搞定
视频看了几百小时还迷糊关注我几分钟让你秒懂发点评论可以给博主加热度哦
真实业务痛点没有多态的代码有多可怕假设你在开发一个支付系统支持微信、支付宝、银联三种支付方式。
❌ 反例用 if-else 写支付逻辑Service public class PaymentService { public String pay(String payType, BigDecimal amount) { if (wechat.equals(payType)) { // 微信支付逻辑调用微信 SDK return 微信支付 amount 元成功; } else if (alipay.equals(payType)) { // 支付宝支付逻辑调用支付宝 SDK return 支付宝支付 amount 元成功; } else if (unionpay.equals(payType)) { // 银联支付逻辑 return 银联支付 amount 元成功; } else { throw new IllegalArgumentException(不支持的支付方式: payType); } } }问题来了每新增一种支付方式就要修改这个方法违反开闭原则方法越来越长像“意大利面条”单元测试困难要覆盖所有分支代码重复比如日志、校验逻辑无法复用。
这就是没有使用“多态”的典型后果
什么是多态一句话讲透多态Polymorphism就是“同一个接口多种实现”——调用者只关心“做什么”不关心“谁来做”。
就像你去餐厅点菜你只说“我要一份牛排”接口厨师 A 做菲力厨师 B 做西冷不同实现你不需要知道是谁做的只要结果对就行在 Java 中多态通过继承 方法重写Override或接口 实现类实现。
手把手改造用多态重构支付系统第一步定义统一接口public interface PaymentStrategy { String pay(BigDecimal amount); String getPayType(); // 用于标识类型 }第二步为每种支付方式写实现类Component public class WechatPayment implements PaymentStrategy { Override public String pay(BigDecimal amount) { // 模拟调用微信支付 return 【微信】支付 amount 元成功; } Override public String getPayType() { return wechat; } } Component public class AlipayPayment implements PaymentStrategy { Override public String pay(BigDecimal amount) { return 【支付宝】支付 amount 元成功; } Override public String getPayType() { return alipay; } } Component public class UnionPayPayment implements PaymentStrategy { Override public String pay(BigDecimal amount) { return 【银联】支付 amount 元成功; } Override public String getPayType() { return unionpay; } }第三步用 Spring 容器自动管理关键Service public class PaymentContext { // Spring 自动注入所有 PaymentStrategy 的实现类 private final MapString, PaymentStrategy paymentMap; public PaymentContext(ListPaymentStrategy strategies) { this.paymentMap strategies.stream() .collect(Collectors.toMap(PaymentStrategy::getPayType, Function.identity())); } public String pay(String payType, BigDecimal amount) { PaymentStrategy strategy paymentMap.get(payType); if (strategy null) { throw new IllegalArgumentException(不支持的支付方式: payType); } return strategy.pay(amount); // ←←← 多态的核心同一行代码不同行为 } }第四步Controller 调用RestController public class PaymentController { Autowired private PaymentContext paymentContext; PostMapping(/pay) public String pay(RequestParam String payType, RequestParam BigDecimal amount) { return paymentContext.pay(payType, amount); // 一行搞定 } }✅效果新增“数字货币支付”只需写一个新类无需修改任何现有代码每个支付类职责单一易于测试主流程清晰无 if-else 嵌套。
多态的三大核心要素要素说明示例继承或接口子类/实现类必须有共同父类或接口WechatPayment implements PaymentStrategy方法重写Override子类提供自己的实现pay()方法在每个类中不同父类引用指向子类对象运行时决定调用哪个实现PaymentStrategy strategy new WechatPayment(); 在 Spring 中我们通过Map 注入实现了“运行时动态选择实现”这是多态的高级应用
反例对比为什么 if-else 是“技术债”维度if-else 方案多态方案扩展性每次加支付方式都要改核心代码新增类即可零修改可读性逻辑混杂难以阅读每个类只做一件事可测试性需 mock 所有分支单独测试每个实现类维护成本越来越高几乎为零记住if-else 不是不能用但当判断的是“类型”且行为不同时优先考虑多态
多态在 Spring Boot 中的经典应用
策略模式 Spring Bean如上文支付系统
事件监听ApplicationListener// 不同事件触发不同处理 EventListener public void handleUserRegistered(UserRegisteredEvent event) { ... } EventListener public void handleOrderPaid(OrderPaidEvent event) { ... }
自定义注解处理器// 不同字段校验规则 Validator(type phone) public class PhoneValidator implements FieldValidator { ... } Validator(type email) public class EmailValidator implements FieldValidator { ... }
常见误区
注意事项⚠️ 误区 1多态 继承错接口 实现更推荐Java 单继承限制接口更灵活。
⚠️ 误区 2所有 if-else 都要改成多态错只有根据类型选择不同行为时才适用。
比如if (age
这种条件判断没必要用多态。
⚠️ 误区 3多态会降低性能在现代 JVM 下虚方法调用invokevirtual优化极好性能损耗几乎为零。
可维护性远比微秒级性能重要
完整项目结构Spring Bootsrc/main/java ├── strategy/ │ ├── PaymentStrategy.java // 接口 │ ├── WechatPayment.java // 实现类 │ ├── AlipayPayment.java │ └── UnionPayPayment.java ├── service/ │ └── PaymentContext.java // 上下文多态调度中心 └── controller/ └── PaymentController.java启动后访问POST /pay?payTypewechatamount
9
9 # 返回【微信】支付
9
9 元成功
九、