当前位置: 首页 > article >正文

策略模式详解与应用

策略模式(Strategy Pattern),是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互相替换,而应用程序可以在运行时选择使用哪一个算法。策略模式使得算法的变化独立于使用该算法的客户。通过将不同的算法封装为独立的类,策略模式能够提供更高的灵活性和可扩展性,同时也简化了客户端代码。

策略模式的特点

  1. 易于扩展:新增加一个策略只需要添加一个新的具体策略类,而不需要修改现有的代码。
  2. 避免条件语句:减少了大量的if-elseswitch-case等条件判断逻辑。
  3. 符合开闭原则:对扩展开放,对修改关闭。
  4. 促进代码重用:多个上下文环境可以共享同一个策略实现。
  5. 分离关注点:将算法的具体实现从调用者中分离出来,降低了耦合度。
  6. 支持多种算法组合:可以轻松地组合不同策略来达到复杂的行为。

策略模式的组成

  • Context(上下文环境):这是客户使用的接口,负责维持对当前策略对象的引用,并根据需要切换到其他策略。
  • Strategy(抽象策略接口/抽象类):定义了一个接口,用于封装一系列相关算法。所有具体策略类都必须实现这个接口。
  • ConcreteStrategy(具体策略类):实现了Strategy接口,并包含了特定算法的实现细节。

策略模式的实现

我们将通过一个简单的例子来演示策略模式的应用:假设我们正在开发一个电商系统,其中有一个折扣计算模块,用来根据不同类型的促销活动(如节日特惠、会员日优惠、满减等)来计算商品的价格折扣。我们可以使用策略模式来管理这些不同的折扣计算方式,确保每次促销活动都能正确地应用相应的折扣规则。

示例代码

// 抽象策略 - DiscountStrategy
interface DiscountStrategy {
    double calculateDiscount(double originalPrice);
}

// 具体策略 - HolidayDiscount
class HolidayDiscount implements DiscountStrategy {
    @Override
    public double calculateDiscount(double originalPrice) {
        return originalPrice * 0.9; // 假设节日特惠是打九折
    }
}

// 具体策略 - MemberDayDiscount
class MemberDayDiscount implements DiscountStrategy {
    @Override
    public double calculateDiscount(double originalPrice) {
        return originalPrice * 0.85; // 假设会员日优惠是打八五折
    }
}

// 具体策略 - FullReductionDiscount
class FullReductionDiscount implements DiscountStrategy {
    private final double threshold;
    private final double reduction;

    public FullReductionDiscount(double threshold, double reduction) {
        this.threshold = threshold;
        this.reduction = reduction;
    }

    @Override
    public double calculateDiscount(double originalPrice) {
        if (originalPrice >= threshold) {
            return originalPrice - reduction;
        } else {
            return originalPrice;
        }
    }
}

// 上下文环境 - ShoppingCart
class ShoppingCart {
    private DiscountStrategy discountStrategy;

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

    public double getTotalPrice(double originalPrice) {
        if (discountStrategy != null) {
            return discountStrategy.calculateDiscount(originalPrice);
        }
        return originalPrice;
    }
}

使用示例

public class StrategyPatternDemo {
    public static void main(String[] args) {
        ShoppingCart cart = new ShoppingCart();

        // 模拟用户选择不同的折扣策略
        System.out.println("Original price: $100");
        cart.setDiscountStrategy(new HolidayDiscount());
        System.out.printf("Holiday discount price: $%.2f\n", cart.getTotalPrice(100));

        cart.setDiscountStrategy(new MemberDayDiscount());
        System.out.printf("Member day discount price: $%.2f\n", cart.getTotalPrice(100));

        cart.setDiscountStrategy(new FullReductionDiscount(100, 20));
        System.out.printf("Full reduction discount price: $%.2f\n", cart.getTotalPrice(100));
    }
}

策略模式的应用场景

  • 当你有一组相关的算法或行为,并且希望在运行时灵活地选择其中一种执行时。
  • 在构建游戏中的AI决策树时,可以根据不同的情况采用不同的行动策略。
  • 对于支付网关的选择,可以根据用户的偏好或地区动态更改支付处理器。
  • 实现排序功能时,允许用户指定不同的排序规则(升序、降序、按字母顺序等)。
  • 构建文本编辑器中的格式化工具栏,让用户可以选择不同的文本样式(粗体、斜体、下划线等)。
  • 在图形处理软件中,提供多种滤镜效果供用户选择。

结语

希望本文能帮助您更好地理解策略模式的概念及其实际应用。如果您有任何疑问或建议,请随时留言交流。


http://www.kler.cn/a/507189.html

相关文章:

  • OpenCV相机标定与3D重建(55)通用解决 PnP 问题函数solvePnPGeneric()的使用
  • 【25考研】西南交通大学软件工程复试攻略!
  • 基于 K-Means 聚类分析实现人脸照片的快速分类
  • 鸿蒙打包发布
  • Ansible自动化运维:基础与实践
  • Windows远程桌面网关出现重大漏洞
  • npm : 无法加载文件 D:\phpdev\nodejs\npm.ps1
  • 【数模学习笔记】插值算法和拟合算法
  • springBoot项目使用Elasticsearch教程
  • docker hello world
  • leetcode 115. 不同的子序列
  • JWT在线解密/解码 - 加菲工具
  • 【人工智能】Python中的自动化机器学习(AutoML):如何使用TPOT优化模型选择
  • 【MySQL实战】mysql_exporter+Prometheus+Grafana
  • 关于jwt和security
  • java day04-面向对象基础(内存 封装 继承 修饰符 工具类 )
  • 【Excel笔记_3】execl的单元格是#DIV/0!,判断如果是这个,则该单元格等于空
  • SAP -最简单smartforms打印保存到本地pdf方法
  • PostCSS安装与基本使用?
  • Java冒泡排序算法之:变种版
  • Require:利用MySQL binlog实现闪回操作
  • 国产化板卡设计原理图:2295-基于 JFM7K325T的半高PCIe x4双路万兆光纤收发卡
  • Django框架:python web开发
  • 深度学习超参数调优秘籍:解锁模型的最佳性能
  • Vue2中使用正则表达式限制输入框输入
  • G1原理—6.G1垃圾回收过程之Full GC