策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互换。策略模式让算法的变化独立于使用算法的客户。
策略模式的核心组成部分:
Context(上下文)
上下文是使用策略的对象,它持有一个对策略接口的引用,并将具体的算法执行委托给策略对象。Strategy(策略接口)
定义了一个公共接口,所有具体策略类都需要实现这个接口。ConcreteStrategy(具体策略)
每个具体策略类实现了策略接口,提供了具体的算法实现。
策略模式的应用场景
- 支付系统:不同的支付方式(信用卡、PayPal、比特币等)可以作为不同的策略。
- 排序算法:在数据处理中,根据需求选择不同的排序算法(快速排序、归并排序、冒泡排序等)。
- 地图导航:提供多种路径规划策略(最短路径、最少时间、避开收费路段等)。
- 游戏AI:不同难度级别的敌人AI可以采用不同的策略。
示例代码(Java)
以下是一个简单的策略模式实现示例:
// 策略接口
interface Strategy {
int execute(int a, int b);
}
// 具体策略A:加法
class ConcreteStrategyAdd implements Strategy {
@Override
public int execute(int a, int b) {
return a + b;
}
}
// 具体策略B:减法
class ConcreteStrategySubtract implements Strategy {
@Override
public int execute(int a, int b) {
return a - b;
}
}
// 具体策略C:乘法
class ConcreteStrategyMultiply implements Strategy {
@Override
public int execute(int a, int b) {
return a * b;
}
}
// 上下文类
class Context {
private Strategy strategy;
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public int executeStrategy(int a, int b) {
return strategy.execute(a, b);
}
}
// 测试策略模式
public class StrategyPatternDemo {
public static void main(String[] args) {
Context context = new Context();
// 使用加法策略
context.setStrategy(new ConcreteStrategyAdd());
System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
// 使用减法策略
context.setStrategy(new ConcreteStrategySubtract());
System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
// 使用乘法策略
context.setStrategy(new ConcreteStrategyMultiply());
System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
}
}
输出结果
10 + 5 = 15
10 - 5 = 5
10 * 5 = 50
优点
- 单一职责原则:每个策略类只负责一个具体的算法实现,使代码更加清晰。
- 开闭原则:新增策略时无需修改现有代码,只需添加新的具体策略类即可。
- 消除条件语句:避免了在上下文中使用大量的
if-else
或switch-case
语句来选择算法。
缺点
- 类数量增加:每种策略都需要一个具体策略类,可能会导致类的数量显著增加。
- 客户端需了解策略:客户端需要了解不同的策略类及其用途,增加了使用的复杂性。