策略设计模式(Strategy Pattern)[论点:概念、组成角色、相关图示、示例代码、适用场景]

news2024/12/26 21:48:05

文章目录

  • 概念
  • 组成角色
  • 相关图示
  • 示例代码
  • 适用场景

概念

        策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列的算法,并将每一个算法封装起来,使它们可以相互替换。策略模式使得算法可以独立于使用它的客户端变化。这种模式的主要目的是将算法的定义与使用分离,以提高代码的灵活性和可重用性。

组成角色

  1. Context(上下文):上下文类,用于维护策略对象的引用。它定义了客户端感兴趣的接口,并提供设置策略对象的方法。
  2. Strategy(策略):策略接口,定义了所有具体策略类需要实现的方法。客户端可以通过这个接口调用策略实现的算法。
  3. ConcreteStrategy(具体策略):实现策略接口的具体策略类,每个具体策略类对应一种算法实现。

相关图示

在这里插入图片描述

示例代码

// 支付策略接口
interface PaymentStrategy {
    void pay(double amount);
}

// 具体策略类:信用卡支付
class CreditCardPaymentStrategy implements PaymentStrategy {
    private String name; // 持卡人姓名
    private String cardNumber; // 信用卡号
    private String cvv; // CVV 安全码
    private String expirationDate; // 信用卡过期日期

    public CreditCardPaymentStrategy(String name, String cardNumber, String cvv, String expirationDate) {
        this.name = name;
        this.cardNumber = cardNumber;
        this.cvv = cvv;
        this.expirationDate = expirationDate;
    }

    @Override
    public void pay(double amount) {
        System.out.println("Paying " + amount + " using Credit Card.");
    }
}

// 具体策略类:支付宝支付
class AlipayPaymentStrategy implements PaymentStrategy {
    private String email; // 支付宝账户邮箱

    public AlipayPaymentStrategy(String email) {
        this.email = email;
    }

    @Override
    public void pay(double amount) {
        System.out.println("Paying " + amount + " using Alipay.");
    }
}

// 上下文类
class PaymentContext {
    private PaymentStrategy paymentStrategy; // 维护一个支付策略对象的引用

    public PaymentContext(PaymentStrategy paymentStrategy) {
        this.paymentStrategy = paymentStrategy;
    }

    public void executePayment(double amount) {
        paymentStrategy.pay(amount);
    }
}

// 客户端
public class PaymentStrategyDemo {
    public static void main(String[] args) {
        // 使用信用卡支付
        PaymentContext paymentContext = new PaymentContext(new CreditCardPaymentStrategy("John Doe", "1234567890123456", "123", "12/25"));
        paymentContext.executePayment(100.0);

        // 使用支付宝支付
        paymentContext = new PaymentContext(new AlipayPaymentStrategy("john.doe@example.com"));
        paymentContext.executePayment(200.0);
    }
}

适用场景

  1. 多个算法互相替换:当你有多个算法,并且这些算法在结构上相似,但是有不同的行为时,可以使用策略模式。通过将每个算法封装在一个具有共同接口的独立类中,可以相互替换这些算法,而不影响使用它们的客户端代码。
  2. 需要在运行时选择算法:当你希望在运行时根据条件选择不同的算法实现时,策略模式是一个很好的选择。客户端可以根据需要选择合适的策略对象,并通过上下文类将请求委托给这个策略对象。
  3. 隔离算法的实现和使用:策略模式将算法的定义与使用分离,使得算法可以独立于使用它的客户端进行变化。这有助于提高代码的灵活性和可重用性,减少代码重复,并降低维护成本。
  4. 避免使用大量条件语句:当你的代码中有许多条件语句,用于根据不同条件选择不同的算法时,可以考虑使用策略模式。策略模式可以将这些条件语句替换为策略对象,从而使代码更加清晰和易于维护。

一些常见的策略模式应用场景包括:

  • 不同类型的排序算法(快速排序、归并排序、冒泡排序等)
  • 不同的支付方式(信用卡支付、支付宝支付、微信支付等)
  • 不同的数据压缩算法(ZIP、RAR、7z等)
  • 不同的策略在游戏中(如AI策略、攻击策略、防御策略等)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

4.12~4.13学习总结

File 相对路径和绝对路径的区别: 相对路径不带盘符,绝对路径带盘符 小知识点:1KB1024字节,1MB1024KB,1GB1024MB; File对象就表示一个路径,可也是文件的路径,也可以是文件夹的路径 这个路径可以是存在的也可…

API-MS-WIN-CRT-RUNTIME-L1-1-0.DLL丢失怎么解决?

API-MS-WIN-CRT-RUNTIME-L1-1-0.DLL是Windows系统中的一个非常重要的动态链接库文件,该文件的全称为“Application Programming Interface Microsoft Windows C Runtime Link Library”。这个DLL文件中包含多个函数库,可将这些函数库链接到应用程序中。在…

AC7811-FOC无感控制代码详解

目录 矢量控制原理 矢量控制框图 电流采样方式 电流在整个控制过程中的传递 采样关键点 三电阻 双电阻 单电阻 三者对比 坐标变换 dq轴电流的PI控制 启动方式 启动波形 脉冲注入 高频注入 Startup 预定位到指定角度 PulseInject_api hfi_api Speed loop s…

已解决:ModuleNotFoundError: No module named ‘flask._compat‘

📋 个人简介 💖 作者简介:大家好,我是阿牛,全栈领域新星创作者。😜🎉 支持我:点赞👍+收藏⭐️+留言📝📣 系列专栏:flask框架从入门到实战🍁💬格言:要成为光,因为有怕黑的人!🔥 相信很多人在flask项目中都遇到了这个报错:ModuleNotFoundError: No …

MyBatis动态SQL的使用

为什么需要使用动态sql? 在实际项目的开发中,开发人员在使用JDBC或其他持久层框架进行开发时,经常需要根据不同的条件拼接SQL语句,拼接SQL语句时还要确保不能遗漏必要的空格、标点符号等,这种编程方式给开发人员带来了非常大的不…

初探JdbcTemplate操作

文章目录一、创建数据库二、创建用户三、打开Spring项目四、添加数据库相关依赖五、创建用户实体类六、创建用户数据访问接口七、创建用户数据访问接口实现类八、创建用户服务类九、创建数据库配置属性文件十、创建Spring配置文件十一、创建用户服务测试类1、测试按编号查询用户…

Java 管道 (学习代码)

目录 上代码: 输出: 执行流程可以总结如下: 上代码: package cn.net.cdsz.ccb.test;import java.io.IOException; import java.io.PipedReader; import java.io.PipedWriter;public class test {static class ReaderThread imp…

C++回溯算法---图的m着色问题01

C回溯算法---图的m着色问题 图的m着色问题是指给定一个图以及m种不同的颜色,尝试将每个节点涂上其中一种颜色,使得相邻的节点颜色不相同。这个问题可以转化为在解空间树中寻找可行解的问题,其中每个分支结点都有m个儿子结点,最底层…

Flink、Hudi技术选型

Flink CDC 2.2的优势 相比Flink1.x,2.x的版本有如下的特点: 1) 并发读取,全量数据的读取性能可以水平扩展。 2) 全程无锁,不对线上业务产生锁的风险。 3) 断点续传,支持全量阶段的 Checkpoint。 Flink SQL的优势 …

MongoDB学习

文章目录前言0 MongoDB和Redis区别1 简介MongoDB2 MongoDB的安装(需要使用Docker)3 MongoDB 概念解析3.1 数据库3 .2 文档3.3 集合3.4 MongoDB 数据类型3.5适用场景4 常用操作4.1 INSERT4.2 Query4.3 Update4.4 Remove4.5 aggregate4.6 索引5 整合Springboot使用5.1 导入依赖5.…

多比特信号跨时钟域同步处理

多比特信号跨时钟域同步处理 当在时钟域之间传递多比特数据时,普通的同步器并不能保证数据传递的安全性。在多时钟设计中,工程师往往容易犯一个错误,即同一事务处理含有需要从一个时钟域向另一个时钟域传递的多位跨时钟数据,并忽略了同步采样…

腾讯云物联网开发平台 LoRaWAN 透传接入 更新版

前言 之前有一篇文章介绍LoRaWAN透传数据,不过还是用物模型云端数据解析脚本,不是真正的透传。腾讯云物联网开发平台也支持对LoRaWAN原始数据的透传、转发。今天来介绍下。腾讯云 IoT Explorer 是腾讯云主推的一站式物联网开发平台,IoT 小能手…

大话数据结构-C(1)

一:数据结构绪论 1.1 数据: 描述客观事物的符号,计算机中可以操作的对象,能被计算机识别并输入给计算机处理的符号集合。 1.2 数据元素 是组成数据的、有一定意义的基本单位,在计算机中通常作为整体处理。也被称为记…

Linux系统如何设置开机自启脚本

Linux系统开启自启脚本的配置,我这里记录了三种办法,对于绝大多数linux系统,这三种方法里肯定有合适的。 1. 设置/etc/rc.local文件 /etc/rc.local文件是 /etc/rc.d/rc.local文件的软连接,rc.local文件本质上就是一个shell脚本 …

电商TO B背后:谁在重构产业带?

在这盘产业带大旗里,京东、淘宝、拼多多正在成为鲜活的新注解。 作者|思杭 编辑|皮爷 出品|产业家 有一座城,这里的百姓在40年前靠“鸡毛换糖”起家,他们聚集了全国各地的商品,再转卖出去。这样一来,就形成了销路…

金三银四最近一次面试,被阿里P8测开虐惨了.....

都说金三银四涨薪季,我是着急忙慌的准备简历——5年软件测试经验,可独立测试大型产品项目,熟悉项目测试流程...薪资要求?5年测试经验起码能要个20K吧 我加班肝了一页半简历,投出去一周,面试电话倒是不少&a…

itop-3568开发板驱动学习笔记(17)内核中断

《【北京迅为】itop-3568开发板驱动开发指南.pdf》 学习笔记 文章目录中断基础中断中断上下文中断号中断源类型内核中断 API获取中断号中断申请释放中断禁止中断使能中断实验程序中断基础 中断 CPU 在正常运行期间,由外部或者内部引起的事件,让 CPU 停下…

研报精选230411

目录 【行业230411华安证券】智能家居行业深度:ChatGPT等大模型催化智能家居行业进一步发展【行业230411信达证券】食品饮料行业2023年第12周周报:从当前时间点看今年液奶的投资机会【行业230411东方财富证券】食品饮料行业专题研究:BC两端需…

2023年信息安全推荐证书

随着网络安全行业的不断升温,相关的认证数量也不断增加,对于在网络安全行业发展的人才来说,提升职业竞争力最有效的办法之一,就是取得权威认证。 那么如何从繁多的适合网络安全从业者的证书中选择含金量高、发展潜力大的证书&…

Java分布式事务(七)

文章目录 🔥Seata提供XA模式实现分布式事务_业务说明🔥Seata提供XA模式实现分布式事务_下载启动Seata服务🔥Seata提供XA模式实现分布式事务_搭建聚合父工程构建🔥Seata提供XA模式实现分布式事务_转账功能实现上🔥Seata提供XA模式实现分布式事务_转账功能实现下🔥Se…