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

news/2024/12/16 5:41:16/

什么是Strategy设计模式

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

为什么需要Strategy模式?

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

UML图解

下面是Strategy模式的通用UML图解:

Context
- strategy: Strategy
+setStrategy(strategy: Strategy)
+executeStrategy()
«interface»
Strategy
+execute()
ConcreteStrategyA
+execute()
ConcreteStrategyB
+execute()

实现示例

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

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

满减折扣策略:

public class FullReductionStrategy implements DiscountStrategy {@Overridepublic double calculateDiscount(double price) {if (price > 100) {return price - 20;}return price;}
}

百分比折扣策略:

public class PercentageDiscountStrategy implements DiscountStrategy {@Overridepublic double calculateDiscount(double price) {return price * 0.9;}
}
上下文类
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);}
}
客户端代码
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模式。


http://www.ppmy.cn/news/1555506.html

相关文章

【LeetCode】3356、零数组变换 II

【LeetCode】3356、零数组变换 II 文章目录 一、数据结构-差分-一维差分、二分1.1 数据结构-差分-一维差分、二分1.1.1 题意复述1.1.2 思路1.1.3 手写二分1.1.4 sort.Search() 二分1.1.5 sort.Find() 二分 二、多语言解法 一、数据结构-差分-一维差分、二分 1.1 数据结构-差分…

第二部分:Linux软件部署

注意:安装操作需要root权限1.MySQL数据库管理系统安装[单机软件] MySQL的安装操可以通过前面学习的yum命令进行。1.1 MySQL5.7在CentOS版本 安装 1. 配置yum仓库 #更新密钥(导入yum仓库需要的密钥)rpm --import https://repo.mysql.com/RPM…

【077】基于51单片机智能消毒柜【Proteus仿真+Keil程序+报告+原理图】

☆、设计硬件组成:51单片机最小系统DHT11温湿度传感器LCD1602液晶显示AT24C02存储芯片紫外线灯继电器按键设置限位开关蜂鸣器LED灯。 1、设计采用STC89C51/52、AT89C51/52、AT89S51/52作为主控芯片; 2、采用DHT11温湿度传感器实时检测温湿度数值&#…

数字证书管理工具 openssl keytool

OPENSSL 命令 openssl command [ command_opts ] [ command_args ] 常用command: version 用于查看版本信息 enc 用于加解密 ciphers 列出加密套件 genrsa 用于生成私钥 -des|-des3|-idea:用来加密私钥文件的三种对称加密算法。 rsa …

在 React 中,创建和嵌套组件、添加标签和样式、显示数据、渲染条件和列表、对事件做出响应并更新界面以及在组件间共享数据是常见的任务

文章目录 1. 创建和嵌套组件创建组件嵌套组件 2. 添加标签和样式添加标签添加样式 3. 显示数据显示静态数据显示动态数据 4. 渲染条件和列表条件渲染列表渲染 5. 对事件做出响应并更新界面处理事件 6. 在组件间共享数据使用 Context API react 如何创建和嵌套组件 如何添加标签…

【LC】231. 2 的幂

题目描述: 给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。 如果存在一个整数 x 使得 n 2x ,则认为 n 是 2 的幂次方。 示例 1: 输入:n 1 输出&a…

从2D到3D:解锁视频中的隐形魔法世界

点击访问 chatTools 免费体验GPT最新模型,包括o1推理模型、GPT4o 和Claude等模型! ## 技术革命:普通视频中的惊人秘密 在数字技术日新月异的今天,3D建模和虚拟现实领域一直存在着巨大的挑战。传统的3D数据获取方式不仅耗时耗力&a…

bug之浮点数精度求和计算

bug描述:电商项目多件商品进行结算时,总金额出现微小偏差;如0.10.20.3吗?还有可能展示成0.30000000000000004;bug原因:由于计算过程中使用浮点数运算,计算机只识别二进制,所以先把0.…