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

  • 创建复杂 → 工厂

相关推荐
学长毕设4 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
C^h4 小时前
c++ string
开发语言·c++
raindayinrain4 小时前
c++高性能--原子操作,无锁编程,操作顺序
开发语言·c++·性能优化
学逆向的4 小时前
C++ 合并命名空间
开发语言·c++·网络安全
Zhao-Jichao4 小时前
VS2026 打包 C++ 程序生成 EXE,借助 Installer Project 扩展工具
开发语言·c++
zzu123zsw5 小时前
从臃肿的模板调用到声明式契约:深入 UniHttp 动态代理与多渠道生命周期扩展
java·spring boot·microsoft·unihttp
学逆向的5 小时前
C 局部静态变量
c语言·开发语言·网络安全
大都督会赢的6 小时前
C++第一节课
开发语言·c++
“AI国潮设计-小江”6 小时前
【AIGC实战】Python+Stable Diffusion打造“英歌舞财神”IP,解锁“马到成功”等爆款情绪营销文案设计
开发语言·人工智能·python·prompt·aigc
源码集结号6 小时前
云诊所门诊系统源码,基于SpringBoot+Vue.js架构,支持多租户设计与Docker容器化部署
java·spring boot·源码·医院信息系统·门诊系统·诊所系统