设计模式:策略模式

设计模式:策略模式

1. 什么是策略模式?

策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互相替换。这种模式使得算法可以在不影响客户端的情况下发生变化,策略模式通常被用来避免代码中的条件判断语句。

在策略模式中,通常有以下几个关键角色:

  • 策略接口(Strategy):定义了算法的接口,所有的具体策略类都需要实现这个接口。
  • 具体策略类(ConcreteStrategy):实现了策略接口,提供具体的算法实现。
  • 上下文类(Context):持有策略接口的引用,可以在运行时动态地更换策略。

image-20240904105250272

2. 策略模式的结构

策略模式的典型结构如下:

  • Strategy:策略接口,定义了一个算法族的公共接口。例如:void execute();
  • ConcreteStrategyA/B:具体策略类,实现了策略接口,包含具体的算法实现。
  • Context:上下文类,使用一个策略对象,可以动态地更换策略。

3. 如何使用策略模式?

下面是一个使用策略模式的Java示例。假设我们有一个订单系统,系统中可以有多种不同的促销策略,例如打折、满减等。我们可以使用策略模式来灵活地应用不同的促销策略。

1. 定义策略接口

1
2
3
4
// 定义策略接口
public interface PromotionStrategy {
void applyPromotion();
}

2. 实现具体策略类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 打折策略
public class DiscountStrategy implements PromotionStrategy {
@Override
public void applyPromotion() {
System.out.println("应用打折策略");
}
}

// 满减策略
public class FullReductionStrategy implements PromotionStrategy {
@Override
public void applyPromotion() {
System.out.println("应用满减策略");
}
}

3. 定义上下文类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 上下文类,持有策略的引用
public class Order {
private PromotionStrategy promotionStrategy;

// 设置具体策略
public void setPromotionStrategy(PromotionStrategy promotionStrategy) {
this.promotionStrategy = promotionStrategy;
}

// 执行策略
public void applyPromotion() {
if (promotionStrategy != null) {
promotionStrategy.applyPromotion();
} else {
System.out.println("没有应用任何促销策略");
}
}
}

4. 客户端代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Client {
public static void main(String[] args) {
// 创建订单
Order order = new Order();

// 使用打折策略
PromotionStrategy discountStrategy = new DiscountStrategy();
order.setPromotionStrategy(discountStrategy);
order.applyPromotion(); // 输出 "应用打折策略"

// 使用满减策略
PromotionStrategy fullReductionStrategy = new FullReductionStrategy();
order.setPromotionStrategy(fullReductionStrategy);
order.applyPromotion(); // 输出 "应用满减策略"
}
}

5. 策略模式的优点

  • 算法的灵活性:策略模式使得算法可以互相替换,且客户端可以根据需要选择不同的算法实现。
  • 减少条件判断语句:使用策略模式可以避免大量的if-elseswitch-case语句,使代码更简洁。
  • 遵循开闭原则:策略模式使得添加新策略非常容易,不需要修改现有代码,只需要添加新的策略类。