策略模式介绍

策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,将每个算法封装起来并使它们可相互替换。策略模式让算法的变化独立于使用算法的客户端,从而实现灵活的算法切换。

核心角色:

  • • 环境类(Context):持有策略接口的引用,负责调用具体策略
  • • 策略接口(Strategy):定义所有支持的算法的公共接口
  • • 具体策略类(ConcreteStrategy):实现策略接口,提供具体算法实现

Java代码实现示例

下面通过一个"支付方式选择"的场景来演示策略模式:

// 策略接口:定义支付算法的公共接口
public interface PaymentStrategy {void pay(double amount);
}// 具体策略类:PayPal支付
public class PayPalPayment implements PaymentStrategy {private String emailId;private String password;public PayPalPayment(String emailId, String password) {this.emailId = emailId;this.password = password;}@Overridepublic void pay(double amount) {System.out.println(amount + " 元用PayPal支付。");// 实际应用中会有验证PayPal账号、连接PayPal接口等逻辑}
}// 具体策略类:信用卡支付
public class CreditCardPayment implements PaymentStrategy {private String name;private String cardNumber;private String cvv;private String expiryDate;public CreditCardPayment(String name, String cardNumber, String cvv, String expiryDate) {this.name = name;this.cardNumber = cardNumber;this.cvv = cvv;this.expiryDate = expiryDate;}@Overridepublic void pay(double amount) {System.out.println(amount + " 元用信用卡支付。");// 实际应用中会有验证信用卡信息、连接支付网关等逻辑}
}// 环境类:购物车,使用支付策略
public class ShoppingCart {private PaymentStrategy paymentStrategy;// 设置支付策略public void setPaymentStrategy(PaymentStrategy paymentStrategy) {this.paymentStrategy = paymentStrategy;}// 结算public void checkout(double amount) {if (paymentStrategy == null) {throw new IllegalStateException("请先设置支付方式");}paymentStrategy.pay(amount);}
}// 客户端代码
public class Main {public static void main(String[] args) {ShoppingCart cart = new ShoppingCart();// 选择信用卡支付PaymentStrategy creditCardPayment = new CreditCardPayment("张三", "1234-5678-9012-3456", "123", "12/25");cart.setPaymentStrategy(creditCardPayment);cart.checkout(100.50);// 切换为PayPal支付PaymentStrategy paypalPayment = new PayPalPayment("zhangsan@example.com", "password123");cart.setPaymentStrategy(paypalPayment);cart.checkout(200.75);}
}

代码解释

  1. 1. 策略接口(PaymentStrategy)
    • • 定义了所有支付方式的统一接口pay(double amount)
    • • 确保所有支付方式都遵循相同的调用规范
  2. 2. 具体策略类
    • • CreditCardPayment:实现信用卡支付的具体逻辑
    • • PayPalPayment:实现PayPal支付的具体逻辑
    • • 每个策略类都封装了自己的算法实现,相互独立
  3. 3. 环境类(ShoppingCart)
    • • 持有支付策略的引用,通过setPaymentStrategy方法设置具体策略
    • • 提供checkout方法,内部调用当前策略的pay方法完成支付
    • • 客户端无需知道具体支付细节,只需与购物车交互
  4. 4. 客户端(Main)
    • • 创建具体的支付策略对象
    • • 通过购物车设置支付策略并完成结算
    • • 可以随时切换不同的支付策略,无需修改购物车代码

策略模式的优势

  • • 灵活性高:可以在运行时动态切换算法
  • • 代码复用:避免使用多重条件判断(if-else或switch)
  • • 开闭原则:新增策略只需实现接口,无需修改现有代码
  • • 责任单一:每个策略类专注于实现一种算法

适用场景:当一个系统需要多种算法,且需要动态选择使用哪种算法时,适合使用策略模式。
更多参考资料

https://pan.baidu.com/s/1c1oQItiA7nZxz8Rnl3STpw?pwd=yftc
https://pan.quark.cn/s/dec9e4868381

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

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

相关文章

SAP Valuation Category在制造业成本核算中的使用场景与配置方案

Valuation Category在制造业成本核算中的使用场景与配置方案一、核心使用场景(制造业特有)1. 内制 vs 外购成本分离业务需求:同一物料可能通过内部生产(成本含料工费)或外部采购(成本含采购价运费&#xff…

我的 LeetCode 日记:Day 36 - 动态规划,背包问题的千变万化

昨天,我初步掌握了 0/1 背包问题的理论基础和标准解法。今天,我将这种思想应用到了更广泛的场景中。今天的几道题,乍一看和背包没什么关系,但通过巧妙的数学转化,它们的核心都变成了 0/1 背包问题。 这让我深刻体会到…

本地处理不上传!隐私安全的PDF转换解决方案

PDF能锁定排版、字体、图片位置,无论在什么设备打开都保持一致。它是无广告、简洁高效的专业PDF处理工具。功能丰富,支持批量操作:只需将文件拖入界面,选择目标格式(如Word、PPT、Excel、图片等)&#xff0…

Docker build创建镜像命令入门教程

一、核心概念Dockerfile 定义镜像构建步骤的文本文件,包含一系列指令和配置,用于自动化创建镜像。镜像层(Layer) Docker 镜像由多层只读层叠加而成,每个指令(如 RUN、COPY)会生成一个新的层。层…

Redis 是单线程模型吗?

最近在面试中经常被问到这个问题:"Redis是单线程的吗?"很多同学都会脱口而出:"是的!"但其实这个答案并不完全正确。今天我们就来聊聊Redis的线程模型,把这个问题彻底搞清楚。 先说结论 Redis的线程…

Hologres实战:路径分析函数

前言 Hologres提供了一套高效的路径分析函数,包括路径明细计算和结果解析功能,能够帮助用户深入理解用户行为路径,并通过桑基图实现数据可视化。 一、核心功能 路径明细计算:精确记录用户在产品或功能中的完整访问路径结果解析…

产品开发实践(常见的软硬结合方式)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】前面说过,传统的纯软件开发,在国内的大背景下面是很难存活的。但是如果是把软件,构建在硬件基础之上&#xff0c…

Linux | i.MX6ULL网络通信-套字节 UDP(第十八章)

01 Linux | i.MX6ULL网络通信-套字节 TCP(第十七章) 02 iTOP-IMX6ULL 实现基于 UDP 的 socket 编程。

学习嵌入式第三十天

文章目录进程和线程&#xff08;续&#xff09;线程1.线程传参2.线程属性3.线程间通信1.概念2.方式3.互斥锁4.死锁5.信号量习题 进程和线程&#xff08;续&#xff09; 线程 1.线程传参使用第四个参数实现对线程内部的传参 代码实现&#xff1a; #include <stdio.h> #inc…

GaussDB 数据库架构师修炼(十三)安全管理(3)-行级访问控制

1 背景行级访问控制特性将数据库的访问控制精确到数据表行级别 &#xff0c;只允许用户查看 、更新或删除特定的行数据。2 实例场景实例以医生只能看到治疗的病人&#xff0c;不能看其它医生的病人为例&#xff1a;1)医院病人的信息表pat_info&#xff1a;csdn> set search_…

Wi-Fi 与蜂窝网络(手机网络)的核心区别,以及 Wi-Fi 技术未来的发展方向

在日常生活中&#xff0c;我们既离不开家里的 Wi-Fi&#xff0c;也离不开手机的 4G/5G 网络。它们都能把我们连接到互联网&#xff0c;但底层的工作方式却大不相同。一、设计初衷的不同Wi-Fi诞生于 1997 年的 IEEE 802.11 标准&#xff0c;定位是局域网无线替代。它的目标是让电…

C++编程实战:高效解决算法与数据结构问题

个人主页 &#xff1a; zxctscl 专栏 【C】、 【C语言】、 【Linux】、 【数据结构】、 【算法】 如有转载请先通知 题目1. 数字统计2. 两个数组的交集3. 牛牛的快递4. 点击消除5. 最小花费爬楼梯6. 简写单词1. 数字统计 BC153 数字统计 #include <iostream> using na…

《零基础入门AI:深度学习中的视觉处理(卷积神经网络(CNN)进阶)》

一、卷积知识扩展 1. 二维卷积 单通道版本 对于单通道输入图像 III (尺寸 HWH \times WHW) 和卷积核 KKK (尺寸 FFF \times FFF)&#xff0c;输出特征图 OOO 的计算公式为&#xff1a; O(i,j)∑m0F−1∑n0F−1I(im,jn)⋅K(m,n)O(i,j) \sum_{m0}^{F-1} \sum_{n0}^{F-1} I(im, j…

pyecharts可视化图表-pie:从入门到精通(进阶篇)

欢迎来到pyecharts饼图系列教程的进阶篇&#xff01;在上一篇基础教程中&#xff0c;我们学习了饼图的基本概念和简单实现。在本文中&#xff0c;我们将深入探索pyecharts中饼图的六种高级用法和自定义选项&#xff0c;包括环形饼图、富文本标签饼图、滚动图例饼图、环形图、嵌…

【JAVA 核心编程】面向对象高级:类变量与方法 抽象类与接口

一、类变量与类方法&#xff08;静态变量&#xff09; 1&#xff09;类变量 class Child{private String name;//定义一个变量count&#xff0c;是一个类变量&#xff08;静态变量&#xff09;static静态//该变量最大的特点就是会被Child 类的所有对象访问public static int co…

【Java基础面试题】数据类型

Java面试高频总结&#xff1a;基本数据类型深度解析 &#x1f4ca; 八种基本数据类型详解数据类型关键字字节数位数默认值取值范围核心特性字节型byte180-128 ~ 127最小整数类型短整型short2160-32,768 ~ 32,767较少使用整型int4320-2 ~ 2-1 (约21亿)最常用整数类型长整型long8…

攻防世界—unseping(反序列化)

一.审题<?php highlight_file(__FILE__);class ease{private $method;private $args;function __construct($method, $args) {$this->method $method;$this->args $args;}function __destruct(){if (in_array($this->method, array("ping"))) {call_u…

AI热点周报(8.10~8.16):AI界“冰火两重天“,GPT-5陷入热议,DeepSeek R2模型训练受阻?

名人说&#xff1a;博观而约取&#xff0c;厚积而薄发。——苏轼《稼说送张琥》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录3分钟速览版&#xff1a;一张表看懂本周AI大事一、GPT-5&#xff1a;期待越高&#x…

Python_vue3_django旅拍在线婚纱摄影网站的设计与实现016023190_源码LW_讲解安装

目录前言-本系统介绍已开发项目效果实现截图开发技术详细介绍论文设计框架系统测试核心代码参考示例总结源码获取详细视频演示或者查看其他版本&#xff1a;文章底部获取博主联系方式&#xff01;前言-本系统介绍 利用Python语言、MySQL数据库&#xff0c;Django框架&#xff0…

Python爬虫-爬取政务网站的文档正文内容和附件数据

前言 本文是该专栏的第67篇,后面会持续分享python爬虫干货知识,记得关注。 本文,笔者以某政务网站为例子。基于Python爬虫采集某政务网站的文档正文内容和其关联的附件数据。 具体的实现思路以及完整实现代码逻辑,笔者将在正文进行详细介绍。废话不多说,跟着笔者直接往下…