设计模式详解(十):策略模式——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模式。

相关推荐
AI人工智能+电脑小能手16 小时前
大白话说Java设计模式-28-模板方法模式(业务实战篇)
java·设计模式·模板方法模式·spring源码·订单系统·代码复用
阿萨德528号18 小时前
npm 包发布实战指南:从零发布、更新迭代到版本治理
前端·npm·策略模式
leeyi19 小时前
两个 Agent 怎么协作:Host-Worker 模式(第91篇-E77)
设计模式·agent·ai编程
AI人工智能+电脑小能手2 天前
大白话说Java设计模式-26-策略模式(业务实战篇)
java·spring·设计模式·策略模式·支付系统·算法切换
coding4u2 天前
Mac 多桌面(Spaces)的正确用法:你的屏幕可以大三倍
macos·docker·计算机外设·文件管理·策略模式
星火10242 天前
【Groovy翻译-进阶篇】Groovy 中的设计模式
后端·设计模式·groovy
AI人工智能+电脑小能手2 天前
大白话说Java设计模式-27-策略模式(源码剖析篇)
java·spring·设计模式·策略模式·源码分析·事务管理·comparator
SL_staff2 天前
风控规则如何从硬编码解耦?我们在 JVS-Rules 中的实践与思考
java·spring boot·设计模式
小此方2 天前
Linux加餐(一):藏在Linux中的设计模式(一)策略模式与日志
linux·设计模式·策略模式
To_OC2 天前
从一行入口代码啃透 NestJS:工厂模式、装饰器和依赖注入是怎么串起来的
后端·设计模式·nestjs