一、概览
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
-
创建复杂 → 工厂