3.9设计模式——Strategy 策略模式(行为型)

意图

定义一系列的算法,把它们一个个封装起来,并且使他们可以相互替换此模式使得算法可以独立于使用它们的客户而变化

结构

  • Strategy(策略)定义所有支持的算法的公共入口。Context使用这个接口来调用某ConcreteStrategy定义的方法。
  • ConcreteStrategy(具体策略)以Strategy接口实现某个具体算法。
  • Context(上下文)用一个ConcreteStrategy对象来配置;维护一个对Strategy对象的引用;可定义一个接口来让Strategy访问它的数据
  • AlgorithmInterface(算法接口)

适用性

  • 许多相关的类仅仅是行为有异,“策略“”提供了一种用多个行为中的一个行为来配置一个类的方法。
  • 需要使用一个算法的不同变体。例如,定义一些反应不同空间的空间、时间权衡的算法。当这些变体实现为一个算法的类层次时,可以使用策略模式。
  • 算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、和算法相关的数据结构。
  • 一个类定义了多种行为,并且这些行为在这类的操作中以多个条件语句的形式出现,将相关的条件分支移入它们各自的Strategy类中,以替代这些条件语句。

代码示例

// 策略接口(Algorithm Interface)
interface PaymentStrategy {void pay(int amount);
}// 具体策略类
class CreditCardPayment implements PaymentStrategy {private String cardNumber;private String cvv;public CreditCardPayment(String cardNumber, String cvv) {this.cardNumber = cardNumber;this.cvv = cvv;}@Overridepublic void pay(int amount) {System.out.println("使用信用卡支付 " + amount + " 元。");// 实现信用卡支付}
}class PayPalPayment implements PaymentStrategy {private String email;private String password;public PayPalPayment(String email, String password) {this.email = email;this.password = password;}@Overridepublic void pay(int amount) {System.out.println("使用PayPal支付 " + amount + " 元。");// 实现PayPal支付}
}// 上下文类
class PaymentContext {private PaymentStrategy paymentStrategy;public void setPaymentStrategy(PaymentStrategy paymentStrategy) {this.paymentStrategy = paymentStrategy;}public void makePayment(int amount) {paymentStrategy.pay(amount);}
}// 主类
public class Main {public static void main(String[] args) {PaymentContext context = new PaymentContext();// 使用信用卡支付策略context.setPaymentStrategy(new CreditCardPayment("1234 5678 9012 3456", "123"));context.makePayment(100);// 使用PayPal支付策略context.setPaymentStrategy(new PayPalPayment("example@example.com", "password123"));context.makePayment(50);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/660700.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【论文阅读】ChipNeMo中的数据集处理

前面总体学习了《ChipNeMo: Domain-Adapted LLMs for Chip Design》,然后又继续仔细看了论文中的领域适配分词和领域数据微调的预训练检索模型,对于数据集的处理,也需要仔细看一下。 提炼重点:1)对于数据集&#xff0…

ROS1快速入门学习笔记 - 11参数的使用与编程方法

目录 一、参数模型(全局字典) 二、使用方法 1. 创建功能包 2. 参数命令行的使用 3. 通过C实现参数设置 4. 在CMakeLists中进行编译 5. 运行程序 6. 编程方法(Python) 一、参数模型(全局字典) 每个节…

[学习笔记]CyberDog小米机器狗 开发学习

1、机器狗本身是UbuntuROS2系统 2、控制机器人只需要了解lcm和Ros topic通讯 3、传感器数据(包括一些imu(/imu)、激光雷达(/scan))会进行topic的一个广播。 仿真环境通信接口: -命令输入(见后续运控说明) 运控lcm数据接口 Motion man…

在离线环境中将 CentOS 7.5 原地升级并迁移至 RHEL 7.9

《OpenShift / RHEL / DevSecOps 汇总目录》 说明 本文将说明如何在离线环境中将 CentOS 7.5 升级并迁移至 RHEL 7.9。为了简化准备过程,本文前面将在在线环境中安装用到的各种所需验证软件,而在后面升级迁移的时候再切换到由 ISO 构成的离线 Yum Repo…

【STM32】F405/407的模块总览图,记录查看

从STM32F405/407数据手册中提取,方便以后查看。主要是什么外设连接在什么总线上,时钟频率是多少。 TIM2、3、4、5、12、13、14在APB1上,最大频率84M TIM1、8、9、10、11在APB2上,最大频率168M

Android(Java)项目支持Kotlin语言开发

Android(Java)项目通过相关Kotlin设置后,允许同时使用Java语言和Kotlin语言进行开发代码的。 示例环境: Android Studio Giraffe | 2022.3.1 Patch 3 Java 8 Kotlin 1.9.20 设置Kotlin选项: 第一步:在项…

LeetCode 110.平衡二叉树(Java/C/Python3/Go实现含注释说明,Easy)

标签 树深度优先搜索递归 题目描述 给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡的二叉树定义为: 一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1。 原题:LeetCode 110.平衡二叉树 思路及…

FSNotes for Mac v6.7.1中文激活:轻量级笔记管理工具

FSNotes for Mac,一款专为Mac用户打造的轻量级笔记管理工具,让您的笔记管理变得简单而高效。 FSNotes for Mac v6.7.1中文激活版下载 它采用Markdown文件格式,让您轻松创建和编辑富文本笔记,无需担心格式问题。同时,FS…

浅论汽车研发项目数字化管理之道

随着汽车行业竞争不断加剧,汽车厂商能否快速、高质地推出贴合市场需求的新车型已经成为车企竞争的重要手段,而汽车研发具备流程复杂、专业领域多、协作难度大、质量要求高等特点,企业如果缺少科学健全的项目管理体系,将会在汽车研…

vue3 jspdf,element table 导出excel、pdf,横板竖版分页

多个表格需要,pdf需要的格式与原本展示的表格样式不同 1.创建一个新的表格,设置pdf需要的样式,用vue的h函数放入dom中 2.excel用xlxs插件直接传入新建el-table的dom,直接导出 3.pdf导出类似excel黑色边框白底黑字的文件,把el-t…

口袋实验室--使用AD2学习频谱参数测试

目录 1. 简介 2. 频谱相关参数 2.1 频谱相关基本概念 2.1.1 采样时间间隔 2.1.2 采样频率 2.1.3 采样点数 2.1.4 采样时间长度 2.1.5 谱线数 2.1.6 奈奎斯特频率 2.1.7 频谱分辨率 2.1.8 最高分析频率 2.1.9 频谱泄露 2.2 窗函数 2.2.1 AD2的窗函数 2.2.2 测试矩…

基于uniapp vue3.0 uView 做一个点单页面(包括加入购物车动画和左右联动)

1、实现效果&#xff1a; 下拉有自定义组件&#xff08;商品卡片、进步器、侧边栏等&#xff09;源码 2、左右联动功能 使用scroll-view来做右边的菜单页&#xff0c;title的id动态绑定充当锚点 <scroll-view :scroll-into-view"toView" scroll-with-animation…