Java设计模式的运用

一、概览

java设计模式有很多,如果没记错的话,是二十三种。真正高频、能立刻提升代码质量的,其实就 8~10 个

级别 模式 你会在哪用到
⭐⭐⭐⭐⭐ 策略模式 if-else 爆炸、规则切换
⭐⭐⭐⭐⭐ 模板方法 通用流程 + 差异步骤
⭐⭐⭐⭐⭐ 责任链 校验 / 过滤 / 审批
⭐⭐⭐⭐ 工厂模式 创建对象、隔离实现
⭐⭐⭐⭐ 装饰器 功能增强(不侵入)
⭐⭐⭐⭐ 适配器 对接第三方
⭐⭐⭐ 观察者 事件通知
⭐⭐⭐ 单例(慎用) 配置 / 客户端
⭐⭐⭐ 外观 降低调用复杂度

二、建议掌握的设计模式

1、策略模式 ------ 干掉 if / else 地狱

java 复制代码
if (type == 1) {
    doA();
} else if (type == 2) {
    doB();
} else if (type == 3) {
    doC();
}

问题:

  • 新规则要改旧代码

  • 容易引入 bug

  • 不可扩展

策略模式(Spring 版)

java 复制代码
public interface PayStrategy {
    void pay(Order order);
}
java 复制代码
@Component("ALI")
public class AliPayStrategy implements PayStrategy {
    public void pay(Order order) { }
}

@Component("WX")
public class WxPayStrategy implements PayStrategy {
    public void pay(Order order) { }
}
java 复制代码
@Autowired
private Map<String, PayStrategy> strategyMap;

public void pay(String type, Order order) {
    strategyMap.get(type).pay(order);
}

可以用在:

  • 支付方式

  • 活动规则

  • 价格计算

  • 听阈匹配 / 产品推荐

2、模板方法

把"流程"写死,把"变化"留给子类

典型场景

流程固定,但某几步不一样

比如:

  • 下单流程

  • 提现流程

  • 审核流程

示例

java 复制代码
public abstract class AbstractWithdraw {

    public final void withdraw() {
        check();
        doWithdraw();
        after();
    }

    protected abstract void doWithdraw();

    protected void after() {}
}
java 复制代码
public class AliWithdraw extends AbstractWithdraw {
    protected void doWithdraw() {}
}

好处

  • 流程不乱

  • 不会"少一步"

  • 非常适合核心业务

3、责任链模式 ------ 校验 / 过滤神器

场景

  • 参数校验

  • 风控校验

  • 多级审核

  • 请求过滤

示例

java 复制代码
public interface Handler {
    void handle(Context ctx);
}
java 复制代码
public class ParamHandler implements Handler {
    public void handle(Context ctx) {
        if (ctx.invalid()) throw new RuntimeException();
    }
}
java 复制代码
List<Handler> handlers = List.of(
    new ParamHandler(),
    new AuthHandler(),
    new RiskHandler()
);

handlers.forEach(h -> h.handle(ctx));

和 AOP 的关系

  • AOP = 横向责任链

  • 责任链 = 显式业务责任链

4、工厂模式

Spring就是最好的例子

java 复制代码
ApplicationContext.getBean();

本质就是:

超级工厂 + IoC

什么时候要自己写工厂模式

  • 创建逻辑复杂

  • 构造参数多

  • 需要隔离实现

5、 装饰器模式 ------ 比继承优雅的设计模式

场景

  • 给接口加日志

  • 给方法加缓存

  • 给服务加统计

AOP = 装饰器 + 动态代理

6、适配器模式 ------ 对接第三方必备

java 复制代码
public interface SmsService {
    void send(String mobile, String msg);
}
java 复制代码
public class AliSmsAdapter implements SmsService {
    private AliSdk aliSdk;
}

统一系统接口,别让第三方"污染业务代码"

7、 观察者模式(事件驱动)

java 复制代码
@EventListener
public void onOrderCreated(OrderCreatedEvent event) {}

单例模式

8、外观模式(Facade)

对外暴露一个简单接口,内部再拆分复杂逻辑

Controller → Service 聚合

三、开发建议(非常重要)

1. 不要为了"用设计模式而用设计模式"
2. 当第三次写相似代码时,再引入模式

四、实战口诀

  • if / else 多 → 策略

  • 流程固定 → 模板

  • 校验很多 → 责任链

  • 接第三方 → 适配器

  • 功能增强 → 装饰器 / AOP

  • 创建复杂 → 工厂

相关推荐
皮皮林5515 小时前
Java性能调优黑科技!1行代码实现毫秒级耗时追踪,效率飙升300%!
java
冰_河5 小时前
QPS从300到3100:我靠一行代码让接口性能暴涨10倍,系统性能原地起飞!!
java·后端·性能优化
桦说编程8 小时前
从 ForkJoinPool 的 Compensate 看并发框架的线程补偿思想
java·后端·源码阅读
躺平大鹅9 小时前
Java面向对象入门(类与对象,新手秒懂)
java
静水流深_沧海一粟10 小时前
04 | 别再写几十个参数的构造函数了——建造者模式
设计模式
StarkCoder10 小时前
从UIKit到SwiftUI的迁移感悟:数据驱动的革命
设计模式
初次攀爬者10 小时前
RocketMQ在Spring Boot上的基础使用
java·spring boot·rocketmq
花花无缺10 小时前
搞懂@Autowired 与@Resuorce
java·spring boot·后端
Derek_Smart12 小时前
从一次 OOM 事故说起:打造生产级的 JVM 健康检查组件
java·jvm·spring boot