首先为什么叫告别面条儿代码?因为面条儿软呀,软趴趴的谁喜欢,没人喜欢的。
我先说一个平常碰到的痛点:当打开一个实现类的一个方法后,你首先看到的是什么?告诉我!
我答一下子:没错是的,满屏的if-else就像意大利面一样绞在一起,改一行代码就像在雷区跳舞。上周我就差点被这样的代码坑哭------需求只是加个新用户类型,我却花了整整一天解谜!直到用上策略模式这个好东西,才把一团乱麻理得清清楚楚。
🌪 面条代码来了
假设我们要做电商折扣系统,看看典型的"面条式"代码:

java
public double calculateDiscount(int userType, double price) {
if (DataType.userType.REGULAR_MEMBER==userType) {
return price * 0.95; // 95折
} else if (DataType.userType.VIP_MEMBER==userType) {
return price * 0.85; // 85折
} else if (DataType.userType.SUPER_MEMBER==userType) {
return price * 0.7; // 7折
} else if (DataType.userType.INTERNAL_EMPLOYEE==userType) {
return price * 0.6; // 6折
} else {
return price; // 无折扣
}
}
当产品经理第5次要求新增"黑卡会员"时,这个方法已经变成40行的"代码龙卷风"。更可怕的是,修改VIP折扣时不小心把普通会员逻辑改崩了------没有隔离的代码就是定时炸弹!
🚀 那该怎么办
策略模式的核心理念很简单:把算法装进盒子,随时替换。就像小孩儿给娃娃换衣服一样,不用重造角色本身。
三步重构指南
-
策略接口
javapublic interface DiscountStrategy { double applyDiscount(double price); }
-
实现策略
java// 普通会员95折 public class RegularDiscount implements DiscountStrategy { @Override public double applyDiscount(double price) { return price * 0.95; } } // VIP 85折 public class VIPDiscount implements DiscountStrategy { @Override public double applyDiscount(double price) { return price * 0.85; } } // 超级VIP 7折 public class SuperVIPDiscount implements DiscountStrategy { @Override public double applyDiscount(double price) { return price * 0.7; } }
-
配置(上下文)
javapublic class DiscountContext { private DiscountStrategy strategy; // 随时更换策略 public void setStrategy(DiscountStrategy strategy) { this.strategy = strategy; } public double executeDiscount(double price) { if(strategy == null) throw new IllegalStateException("未设置折扣策略"); return strategy.applyDiscount(price); } }
实战效果
java
public static void main(String[] args) {
DiscountContext context = new DiscountContext();
// 普通会员结算
context.setStrategy(new RegularDiscount());
System.out.println("普通会员支付:" + context.executeDiscount(100)); // 输出95.0
// VIP结算
context.setStrategy(new VIPDiscount());
System.out.println("VIP支付:" + context.executeDiscount(100)); // 输出85.0
}
🧩 策略模式思维导图
css
策略模式宇宙
├── 指挥官(Context)
│ ├── 持有一个策略武器
│ └── 执行战斗命令
├── 策略接口(Strategy)
│ ├── 定义算法标准
├── 具体策略(Concrete Strategies)
│ ├── 武器A:普通会员策略
│ ├── 武器B:VIP策略
│ └── 武器C:超级VIP策略
└── 客户端(Client)
├── 选择武器
└── 发起战斗
为什么说这是神级操作?
- 扩展性:新增折扣类型只需加个新类,老代码纹丝不动
- 隔离性:修改VIP逻辑?其他策略毫发无伤
- 可读性 :业务逻辑变成自解释的
setStrategy(new VIPDiscount())
- 测试爽翻天:每个策略都能单独单元测试
上周那个让我崩溃的需求,用策略模式后20分钟搞定:
java
// 新增黑卡会员策略
public class BlackCardDiscount implements DiscountStrategy {
@Override
public double applyDiscount(double price) {
return price * 0.5; // 5折
}
}
// 使用端
context.setStrategy(new BlackCardDiscount());
🌅 最后说点实在的
策略模式不是厉害的东西,但绝对是解决分支逻辑的好方法。下次当你手指放在键盘上准备写第5个if时,不妨问问自己:"这块逻辑未来会变吗?"但是我想可能大多数人不会,我们大多数人想的是只要它不影响正常运行逻辑是啥的, 我改它干啥。有时间摸会儿鱼不香吗?
但是老铁你得记着,想要提高,那你的脚步就不能停止,OK就分享到这里吧!