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

策略设计模式

1. 什么是策略模式

策略模式是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户端,客户端中的具体实现只需要了解上下文类。

2. 由什么组成

  1. 策略接口(Strategy):定义所有支持的算法的公共接口,也就抽象接口
  2. 具体策略类(Concrete Strategy):实现策略接口的具体算法
  3. 上下文类(Context):持有一个策略对象的引用,通过策略接口与具体策略交互

3. 怎么实现

// 1. 策略接口
interface PaymentStrategy {void pay(int amount);
}// 2. 具体策略类
class CreditCardPayment implements PaymentStrategy {private String cardNumber;public CreditCardPayment(String cardNumber) {this.cardNumber = cardNumber;}@Overridepublic void pay(int amount) {System.out.println("使用信用卡支付 " + amount + " 元,卡号:" + cardNumber);}
}class AlipayPayment implements PaymentStrategy {private String account;public AlipayPayment(String account) {this.account = account;}@Overridepublic void pay(int amount) {System.out.println("使用支付宝支付 " + amount + " 元,账户:" + account);}
}// 3. 上下文类
class ShoppingCart {private PaymentStrategy paymentStrategy;public void setPaymentStrategy(PaymentStrategy strategy) {this.paymentStrategy = strategy;}public void checkout(int amount) {paymentStrategy.pay(amount);}
}// 4. 客户端使用
public class Client {public static void main(String[] args) {ShoppingCart cart = new ShoppingCart();// 使用信用卡支付cart.setPaymentStrategy(new CreditCardPayment("1234-5678-9012-3456"));cart.checkout(1000);// 切换为支付宝支付cart.setPaymentStrategy(new AlipayPayment("example@alipay.com"));cart.checkout(500);}
}

4. 应用的场景

比较常见的支付业务,需要根据具体的选择具体的支付方式

商品的不同折扣策略

压缩工具的压缩算法的选择

游戏角色的不同攻击策略

5. 优点和缺点

5.1. 优点

  • 松耦合:策略模式将不同的策略封装在独立的类中,与上下文对象解耦,增加了代码的灵活性和可维护性。
  • 易于扩展:可以通过添加新的策略类来扩展系统的功能,无需修改现有代码。
  • 符合开闭原则:对于新的策略,无需修改上下文对象,只需要实现新的策略接口即可

5.2. 缺点

  • 类数量增多:每个具体策略都需要一个独立的类,如果策略较多,将导致类的数量增加。
  • 上层必须知道所有策略类:客户端必须知道有哪些策略,并选择合适的策略进行使用,也就是说客户端必须对策略有一个详细的了解。
http://www.lqws.cn/news/479359.html

相关文章:

  • 使用 RedisVL 进行复杂查询
  • Vue 组件定义方式的区别
  • Rabbitmq集成springboot 使用死信队列
  • day 39 打卡
  • 10-K 和 10-Q是什么?
  • MySQL基础函数篇
  • DubboSPI
  • 如何在FastAPI中玩转GitHub认证,让用户一键登录?
  • 安卓对外发布工程源码:怎么做到仅UI层公布
  • Openwrt基本初始化(安装中文包,磁盘扩容)
  • MATLAB的.mat文件
  • Python 商务数据分析—— NumPy 学习笔记Ⅱ
  • Spark教程1:Spark基础介绍
  • 爬虫入门练习(文字数据的爬取)
  • Vue3解析Spring Boot ResponseEntity
  • “MOOOA多目标鱼鹰算法在无人机多目标路径规划
  • 2025国际无人机应用及防控大会四大技术专题深度解析
  • 算法-动态规划-钢条切割问题
  • 理解后端开发中的中间件(以gin框架为例)
  • Android14 app被冻结导致进程间通信失败
  • 一键打包利器:gopack - 极简Go程序编译与压缩工具
  • 解决OSS存储桶未创建导致的XML错误
  • 【CBAP50技术手册】#44 Survey and Questionnaire(问卷调研):BA(业务分析师)的“信息入口”
  • 反无人机系统:技术利刃如何守护低空安全?
  • 【2025年软考中级】第三章数据结构3.4 数组与矩阵
  • 计算鱼眼相机的内参矩阵和畸变系数方法
  • 开源 python 应用 开发(二)基于pyautogui、open cv 视觉识别的工具自动化
  • linux VFS简介
  • Java面试复习:基础、面向对象、多线程、JVM与Spring核心考点
  • 历史数据分析——山西汾酒