设计模式详解(十):策略模式——Strategy

什么是Strategy设计模式?

Strategy模式是一种行为型设计模式,它定义了一系列算法,将每种算法封装到独立的类中,使它们可以互换。使用该模式,可以在不修改客户端代码的情况下动态地改变算法的行为。

为什么需要Strategy模式?

  • 避免代码重复:在同一个类中包含多种算法会导致代码膨胀,Strategy模式通过分离不同的算法解决了这一问题。
  • 提高扩展性:可以轻松地添加新的算法,而无需修改现有代码。
  • 遵循开闭原则:通过封装算法,使得类对扩展开放,对修改关闭。

UML图解

下面是Strategy模式的通用UML图解:
Context - strategy: Strategy +setStrategy(strategy: Strategy) +executeStrategy() <<interface>> Strategy +execute() ConcreteStrategyA +execute() ConcreteStrategyB +execute()

实现示例

以下是一个简单的例子,展示如何使用Strategy模式实现不同的折扣策略。

定义策略接口
java 复制代码
public interface DiscountStrategy {
    double calculateDiscount(double price);
}
实现具体策略

满减折扣策略:

java 复制代码
public class FullReductionStrategy implements DiscountStrategy {
    @Override
    public double calculateDiscount(double price) {
        if (price > 100) {
            return price - 20;
        }
        return price;
    }
}

百分比折扣策略:

java 复制代码
public class PercentageDiscountStrategy implements DiscountStrategy {
    @Override
    public double calculateDiscount(double price) {
        return price * 0.9;
    }
}
上下文类
java 复制代码
public class ShoppingCart {
    private DiscountStrategy discountStrategy;

    public void setDiscountStrategy(DiscountStrategy discountStrategy) {
        this.discountStrategy = discountStrategy;
    }

    public double calculatePrice(double price) {
        if (discountStrategy == null) {
            throw new IllegalStateException("Discount strategy not set");
        }
        return discountStrategy.calculateDiscount(price);
    }
}
客户端代码
java 复制代码
public class Main {
    public static void main(String[] args) {
        ShoppingCart cart = new ShoppingCart();

        // 使用满减策略
        cart.setDiscountStrategy(new FullReductionStrategy());
        System.out.println("满减后价格: " + cart.calculatePrice(120));

        // 使用百分比折扣策略
        cart.setDiscountStrategy(new PercentageDiscountStrategy());
        System.out.println("折扣后价格: " + cart.calculatePrice(120));
    }
}

流程图

以下是Strategy模式的执行流程:
Context设置Strategy 调用executeStrategy方法 执行具体Strategy中的方法 返回结果

优点

  1. 清晰的职责分离:每种算法被封装在独立的类中。
  2. 易于扩展:可以随时添加新的策略。
  3. 可维护性强:更改某种策略只需修改对应的策略类,不影响其他部分。

缺点

  1. 类数量增加:每种策略都需要单独的类,可能导致类的数量膨胀。
  2. 客户端需要理解不同的策略:客户端代码需要知道何时使用何种策略。

适用场景

  • 系统需要动态地在多个算法中选择其一。
  • 不同的客户需要不同的业务规则处理。
  • 避免使用条件语句将多个算法硬编码在一个类中。

总结

Strategy模式是解决算法或行为动态切换的有效方法。它通过将算法抽象化,使得代码更加灵活、易于扩展,同时也减少了代码重复。如果你在开发过程中遇到了需要频繁修改或扩展算法的需求,不妨考虑使用Strategy模式。

相关推荐
晨米酱2 小时前
JavaScript 中"对象即函数"设计模式
前端·设计模式
数据智能老司机8 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机9 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机9 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机9 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
使一颗心免于哀伤9 小时前
《设计模式之禅》笔记摘录 - 21.状态模式
笔记·设计模式
数据智能老司机1 天前
精通 Python 设计模式——创建型设计模式
python·设计模式·架构
数据智能老司机1 天前
精通 Python 设计模式——SOLID 原则
python·设计模式·架构
烛阴1 天前
【TS 设计模式完全指南】懒加载、缓存与权限控制:代理模式在 TypeScript 中的三大妙用
javascript·设计模式·typescript
李广坤1 天前
工厂模式
设计模式