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

  • 创建复杂 → 工厂

相关推荐
014-code10 分钟前
线程池参数怎么配才不翻车
java
吴梓穆11 分钟前
UE5 c++ 常用方法
java·c++·ue5
hoiii18727 分钟前
CSTR反应器模型的Simulink-PID仿真(MATLAB实现)
开发语言·matlab
王夏奇33 分钟前
python中的__all__ 具体用法
java·前端·python
明湖起风了39 分钟前
mqtt消费堆积
java·jvm·windows
Free Tester1 小时前
如何判断 LeakCanary 报告的严重程度
java·jvm·算法
炘爚1 小时前
C++ 右值引用与程序优化
开发语言·c++
si莉亚1 小时前
ROS2安装EVO工具包
linux·开发语言·c++·开源
清心歌1 小时前
CopyOnWriteArrayList 实现原理
java·开发语言
Java成神之路-2 小时前
通俗易懂理解 Spring MVC 拦截器:概念、流程与简单实现(Spring系列16)
java·spring·mvc