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

  • 创建复杂 → 工厂

相关推荐
编程(变成)小辣鸡1 天前
Redisson 知识点及使用场景
java·redisson
源代码•宸1 天前
Leetcode—1339. 分裂二叉树的最大乘积【中等】
开发语言·后端·算法·leetcode·golang·dfs
Chasing Aurora1 天前
C++后端开发之旅(一)
java·开发语言·c++
码农水水1 天前
美团Java后端Java面试被问:Kafka的零拷贝技术和PageCache优化
java·开发语言·后端·缓存·面试·kafka·状态模式
optimistic_chen1 天前
【Redis系列】Java操作Redis客户端
java·linux·redis·客户端·服务端
千金裘换酒1 天前
LeetCode 两数之和 Java
java·算法·leetcode
sunddy_x1 天前
Spring IOC 入门
java·spring
计算机毕设指导61 天前
基于微信小程序的考研资源共享系统【源码文末联系】
java·spring boot·后端·考研·微信小程序·小程序·maven
superman超哥1 天前
Rust 结构体中的生命周期参数:所有权设计的核心抉择
开发语言·后端·rust·rust结构体·rust生命周期·所有权设计