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

  • 创建复杂 → 工厂

相关推荐
m0_748229991 分钟前
ThinkPHP快速入门:从零到实战
c语言·开发语言·数据库·学习
liu****2 分钟前
三.Qt图形界面开发完全指南:从入门到掌握常用控件
开发语言·c++·qt
阿蒙Amon11 分钟前
C#每日面试题-Thread.Sleep和Task.Delay的区别
java·数据库·c#
Haooog12 分钟前
AI应用代码生成平台
java·学习·大模型·langchain4j
布茹 ei ai15 分钟前
Python屏幕监视器 - 自动检测屏幕变化并点击
开发语言·python
爬山算法25 分钟前
Hibernate(67)如何在云环境中使用Hibernate?
java·后端·hibernate
小龙报29 分钟前
【C语言进阶数据结构与算法】单链表综合练习:1.删除链表中等于给定值 val 的所有节点 2.反转链表 3.链表中间节点
c语言·开发语言·数据结构·c++·算法·链表·visual studio
黎雁·泠崖36 分钟前
Java抽象类与接口:定义+区别+实战应用
java·开发语言
2301_7925800039 分钟前
xuepso
java·服务器·前端
cfqq19891 小时前
Settings,变量保存
开发语言·c#