为什么要学习设计模式?
🤷 不学设计模式会怎样?
让我们看一个真实的例子。假设你要开发一个支付系统,支持微信支付、支付宝支付。
❌ 不用设计模式的写法
public class PaymentService {
public void pay(String type, double amount) {
if ("wechat".equals(type)) {
System.out.println("微信支付:" + amount + "元");
// 微信支付的具体逻辑...
} else if ("alipay".equals(type)) {
System.out.println("支付宝支付:" + amount + "元");
// 支付宝支付的具体逻辑...
} else if ("unionpay".equals(type)) {
System.out.println("银联支付:" + amount + "元");
// 银联支付的具体逻辑...
}
// 如果再加一种支付方式呢?继续加 else if...
}
}
问题来了:
- 每次新增支付方式,都要修改这个类
- if-else 越来越长,代码越来越难维护
- 违反了"开闭原则"
✅ 使用策略模式的写法
// 1. 定义支付策略接口
public interface PayStrategy {
void pay(double amount);
}
// 2. 实现各种支付策略
public class WechatPay implements PayStrategy {
@Override
public void pay(double amount) {
System.out.println("微信支付:" + amount + "元");
}
}
public class AlipayPay implements PayStrategy {
@Override
public void pay(double amount) {
System.out.println("支付宝支付:" + amount + "元");
}
}
// 3. 使用策略
public class PaymentService {
private PayStrategy strategy;
public void setStrategy(PayStrategy strategy) {
this.strategy = strategy;
}
public void pay(double amount) {
strategy.pay(amount);
}
}
优点:
- 新增支付方式只需要新增一个类,不用修改现有代码
- 代码结构清晰,每个类职责单一
- 符合"开闭原则"
💡 设计模式的价值
1. 可维护性 ⬆️
代码结构清晰,改动影响范围小,bug 好定位。
2. 可扩展性 ⬆️
新需求来了,只需要添加代码,不用大改现有逻辑。
3. 可复用性 ⬆️
同样的模式可以在不同项目中使用,代码复用率高。
4. 可读性 ⬆️
看到设计模式的名字,就知道代码的意图,便于团队协作。
🌍 设计模式在框架中的应用
| 框架 | 使用的设计模式 |
|---|---|
| Spring | 工厂模式、单例模式、代理模式、模板方法模式... |
| MyBatis | 建造者模式、工厂模式、代理模式... |
| JDK | 迭代器模式、装饰器模式、观察者模式... |
学会设计模式,看源码时你会有这样的感觉:
"哦!这里用的是代理模式!" "原来 Spring 是用工厂模式创建 Bean 的!"
🚀 开始你的学习之旅
不要被 23 种模式吓到,其实:
- 常用的只有 10 种左右
- 很多模式的思想是相通的
- 结合实际案例,理解起来并不难
准备好了吗?让我们从最简单的单例模式开始!
