设计模式:策略模式
1. 什么是策略模式?
策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互相替换。这种模式使得算法可以在不影响客户端的情况下发生变化,策略模式通常被用来避免代码中的条件判断语句。
在策略模式中,通常有以下几个关键角色:
- 策略接口(Strategy):定义了算法的接口,所有的具体策略类都需要实现这个接口。
- 具体策略类(ConcreteStrategy):实现了策略接口,提供具体的算法实现。
- 上下文类(Context):持有策略接口的引用,可以在运行时动态地更换策略。
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-else
或switch-case
语句,使代码更简洁。
- 遵循开闭原则:策略模式使得添加新策略非常容易,不需要修改现有代码,只需要添加新的策略类。