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

策略模式详解:实现灵活多样的支付方式

多支付方式的实现:策略模式详解

策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互换使用。策略模式使得算法可以独立于使用它的客户端变化。本文将通过一个具体的业务场景来介绍策略模式,并给出相应的代码实现。

业务场景

我们以一个电商平台为例,该平台支持多种支付方式,包括信用卡支付、PayPal支付和比特币支付。我们希望在不修改客户端代码的情况下可以轻松添加新的支付方式。

策略模式结构

策略模式主要包括以下几个部分:

  1. 策略接口(Strategy):定义了算法的接口。
  2. 具体策略(Concrete Strategy):实现了策略接口的具体算法。
  3. 上下文(Context):使用策略对象。

类图

下面是策略模式的类图:

在这里插入图片描述

策略接口

首先,我们定义一个策略接口 PaymentStrategy,所有的支付方式都需要实现这个接口。

// 定义支付策略接口
public interface PaymentStrategy {void pay(int amount); // 支付方法,接受支付金额作为参数
}

具体策略

接下来,我们实现几个具体的支付策略:信用卡支付、PayPal支付和比特币支付。

// 信用卡支付策略的实现
public class CreditCardPayment implements PaymentStrategy {private String cardNumber; // 信用卡号private String cardHolderName; // 持卡人姓名// 构造函数初始化信用卡信息public CreditCardPayment(String cardNumber, String cardHolderName) {this.cardNumber = cardNumber;this.cardHolderName = cardHolderName;}@Overridepublic void pay(int amount) {// 信用卡支付逻辑System.out.println("Paid " + amount + " using Credit Card.");}
}
// PayPal支付策略的实现
public class PayPalPayment implements PaymentStrategy {private String email; // PayPal账号邮箱// 构造函数初始化PayPal账号public PayPalPayment(String email) {this.email = email;}@Overridepublic void pay(int amount) {// PayPal支付逻辑System.out.println("Paid " + amount + " using PayPal.");}
}
// 比特币支付策略的实现
public class BitcoinPayment implements PaymentStrategy {private String walletAddress; // 比特币钱包地址// 构造函数初始化比特币钱包地址public BitcoinPayment(String walletAddress) {this.walletAddress = walletAddress;}@Overridepublic void pay(int amount) {// 比特币支付逻辑System.out.println("Paid " + amount + " using Bitcoin.");}
}

上下文

最后,我们需要一个上下文类 PaymentContext,它使用 PaymentStrategy 来进行支付。

// 支付上下文类
public class PaymentContext {private PaymentStrategy paymentStrategy; // 当前使用的支付策略// 设置支付策略public void setPaymentStrategy(PaymentStrategy paymentStrategy) {this.paymentStrategy = paymentStrategy;}// 使用当前的支付策略进行支付public void payAmount(int amount) {paymentStrategy.pay(amount);}
}

客户端代码

在客户端代码中,我们可以根据不同的支付方式来设置不同的策略。

public class Client {public static void main(String[] args) {PaymentContext context = new PaymentContext();// 使用信用卡支付context.setPaymentStrategy(new CreditCardPayment("1234-5678-9012-3456", "John Doe"));context.payAmount(100);// 使用PayPal支付context.setPaymentStrategy(new PayPalPayment("john.doe@example.com"));context.payAmount(200);// 使用比特币支付context.setPaymentStrategy(new BitcoinPayment("1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa"));context.payAmount(300);}
}

测试结果

在这里插入图片描述

总结

策略模式通过定义一系列算法,使得这些算法可以互换使用,并且客户端可以在运行时选择不同的算法。通过使用策略模式,我们可以在不修改客户端代码的情况下轻松添加新的算法,实现了代码的开放-关闭原则(Open/Closed Principle)。

策略模式在实际开发中非常有用,特别是在需要动态选择算法或行为的场景下。希望通过本文的介绍,您对策略模式有了更深入的理解,并能在实际项目中灵活应用。

相关文章:

策略模式详解:实现灵活多样的支付方式

多支付方式的实现:策略模式详解 策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互换使用。策略模式使得算法可以独立于使用它的客户端变化。本文将通…...

SQL根据分隔符折分不同的内容放到临时表

SQL Server存储过程里根据分隔符折分不同的内容放到临时表里做查询条件,以下分隔符使用“/”,可修改不同分隔符 --根据分隔符折分不同的内容放到临时表--------------- SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS id, LTRIM(RTR…...

微信小程序引入vant-weapp组件教程

本章教程,介绍如何在微信小程序中引入vant-weapp。 vant-weapp文档:https://vant-ui.github.io/vant-weapp/#/button 一、新建一个小程序 二、npm初始化 npm init三、安装 Vant Weapp‘ npm i @vant/weapp -...

从零到多页复用:我的WPF MVVM国际化实践

文章目录 第一步:基础实现,资源文件入门第二步:依赖属性,提升WPF体验第三步:多页面复用,减少重复代码第四步:动态化,应对更多字符串总结与反思 作为一名WPF开发者,我最近…...

uniapp 常用 UI 组件库

1. uView UI 特点: 组件丰富:提供覆盖按钮、表单、图标、表格、导航、图表等场景的内置组件。跨平台支持:兼容 App、H5、小程序等多端。高度可定制:支持主题定制,组件样式灵活。实用工具类:提供时间、数组操…...

C++编写Redis客户端

目录 安装redis-plus-plus库 ​编辑 编译Credis客户端 redis的通用命令使用 get/set exists del keys expire /ttl type string类型核心操作 set和get set带有超时时间 set带有NX string带有XX mset mget getrange和setrange incr和decr list类型核心操作…...

基于大模型预测的急性横贯性脊髓炎诊疗方案研究报告

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与方法 1.3 国内外研究现状 二、急性横贯性脊髓炎概述 2.1 疾病定义与分类 2.2 病因与发病机制 2.3 临床表现与诊断标准 三、大模型在急性横贯性脊髓炎预测中的应用 3.1 大模型介绍与原理 3.2 数据收集与预处理 3.3 …...

nature genetics | SCENT:单细胞多模态数据揭示组织特异性增强子基因图谱,并可识别致病等位基因

–https://doi.org/10.1038/s41588-024-01682-1 Tissue-specific enhancer–gene maps from multimodal single-cell data identify causal disease alleles 研究团队和单位 Alkes L. Price–Broad Institute of MIT and Harvard Soumya Raychaudhuri–Harvard Medical S…...

【C语言】指针篇

目录 C 语言指针概述指针的声明和初始化声明指针初始化指针指针的操作解引用操作指针算术运算指针的用途动态内存分配作为函数参数指针与数组数组名作为指针通过指针访问数组元素指针算术和数组数组作为函数参数指针数组和数组指针指针数组数组指针函数指针函数指针的定义和声明…...

​DeepSeek:如何通过自然语言生成HTML文件与原型图?

在当今快节奏的开发与设计环境中,快速生成HTML文件或原型图是每个开发者与设计师的迫切需求。虽然DeepSeek无法直接生成图片,但它却能够通过自然语言生成流程图、原型图以及交互式页面,甚至可以直接输出HTML代码。本文将详细介绍如何与DeepSe…...

数据结构与算法(两两交换链表中的结点)

原题 24. 两两交换链表中的节点 - 力扣(LeetCode) 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示…...

语言模型作为零样本规划者:提取可执行知识以供具身代理使用

【摘要】 本文研究了预训练的语言模型(LLMs)能否被用来执行在交互式环境中的任务。作者发现,尽管LLMs在生成高阶任务的行动计划时可能无法做到完全精确定义,但通过适当提示,大型预训练语言模型可以分解高阶任务到中阶…...

Baklib智能推荐引擎驱动内容中台升级

智能推荐引擎技术架构 现代智能推荐系统的技术架构以语义分析算法为核心,通过自然语言处理技术解构内容特征,结合动态知识图谱实现信息实体关系的智能映射。该系统采用分层设计架构,基础层依托深度学习模型处理海量非结构化数据,…...

显示器长时间黑屏

现象 电脑启动后,进入登录界面前会随机黑屏,有时候十几秒,有时候几分钟 进入桌面后,长时间不操作电脑黑屏,移动鼠标,点击键盘后尝试点亮屏幕,也会消耗较长时间 尝试 重装系统,或者重新安装显卡,都能够恢复,但过段时间以后又出现黑屏情况 集成显卡,独立显卡都出现过 操作系统…...

顺序表与链表·续

引言 本文承接上文(顺序表与链表-CSDN博客),开始对链表的要点提炼。前文提到顺序表适合需要频繁随机访问且数据量固定的场景,而链表适合需要频繁插入和删除且数据量动态变化的场景。链表的引入弥补了顺序表在动态性和操作效率上的…...

nvidia驱动升级-ubuntu 1804

升级 1.从官网下载*.run驱动文件 2.卸载原始驱动 sudo /usr/bin/nvidia-uninstall sudo apt-get --purge remove nvidia-\* # 可能不需要加-\ sudo apt-get purge nvidia-\* # 可能不需要加-\ sudo apt-get purge libnvidia-\* # 可能不需要…...

【Linux】——初识操作系统

文章目录 冯-诺依曼体系结构操作系统shell 冯-诺依曼体系结构 我们现在所使用的计算机就是冯-诺依曼体系结构。 存储器就是内存。 由下图可知,寄存器最快,为啥不用寄存器呢? 因为越快价格就最贵,冯诺依曼体系结构的诞生&#xf…...

本地化deepseek

小白都能拥有自己的人工智能 1、我本地环境 系统:win10 cpu:i7(i7-12700),差不多就行 硬盘:500G+2T,可以不用这么大 显卡:七彩虹2060 12G ,够用了 我的配置最高也只能配上8B了, R1模型版本CPUGPU内存存储8B Intel Core i7/AMD Ryzen 7 及以上 无强制要求,有 4…...

利用可变参数模板,可打印任意参数和参数值。(C++很好的调式函数)

很酷的应用&#xff1a; &#xff08;1&#xff09; 如何获取可变参数名 代码例子&#xff1a; #define _test(...) (test_t(#__VA_ARGS__, __VA_ARGS__))template<typename... Args> void test_t(const char* names, Args... args) {std::cout << names <<…...

Yashan DB 体系结构

一、体系结构概况 1.1 线程管理 YashanDB采用多线程架构&#xff0c;线程分为两类&#xff1a; • 工作线程&#xff08;Worker Threads&#xff09;&#xff1a;每个客户端连接到数据库实例时&#xff0c;会创建一个工作线程。工作线程负责处理客户端的SQL请求&#xff0c;执…...

3分钟破解微信小程序加密包:wxappUnpacker极速解析实战指南

3分钟破解微信小程序加密包&#xff1a;wxappUnpacker极速解析实战指南 【免费下载链接】wxappUnpacker 项目地址: https://gitcode.com/gh_mirrors/wxappu/wxappUnpacker wxappUnpacker是一款专注于微信小程序逆向解析的开源工具&#xff0c;能够快速破解wxapkg格式(微…...

告别手动修改!用Env文件管理器一键配置Allegro SKILL加载路径(支持16.6/17.4)

告别手动修改&#xff01;用Env文件管理器一键配置Allegro SKILL加载路径&#xff08;支持16.6/17.4&#xff09; 在PCB设计领域&#xff0c;Allegro作为行业标杆工具&#xff0c;其强大的可扩展性离不开SKILL脚本的支持。然而&#xff0c;随着项目复杂度提升&#xff0c;SKILL…...

手把手教你用R玩转MSigDB:从数据库下载、基因集构建到GSEA/GSVA完整流程

手把手教你用R玩转MSigDB&#xff1a;从数据库下载、基因集构建到GSEA/GSVA完整流程 如果你正在寻找一个权威的基因集数据库来支持你的转录组功能分析&#xff0c;MSigDB&#xff08;Molecular Signatures Database&#xff09;无疑是首选。作为Broad研究所维护的核心资源&…...

单一模型可能涌现不出超级智能,但 Agent 协作体却极有可能。

当 AI 把产品能力拉齐&#xff0c;注意力才是唯一的护城河 你有没有这种感觉&#xff1f;2025 年底&#xff0c;用 AI 一键生成一个完整 App 已经不是什么新闻&#xff0c;Vibe Coding 让普通开发者一天就能上线一个产品。可产品做出来了&#xff0c;下载量却像石沉大海&#x…...

编译原理避坑指南:自顶向下语法分析的5个常见错误及解决方法

编译原理避坑指南&#xff1a;自顶向下语法分析的5个常见错误及解决方法 第一次接触自顶向下语法分析时&#xff0c;我盯着那个无限循环的递归文法整整三天没想明白——为什么明明按照教材步骤操作&#xff0c;程序却始终报错&#xff1f;直到助教指出我忽略了间接左递归的隐蔽…...

Excel办公必备4个技巧:格式转换、隔列插入、限制编辑、文本数字分离

在日常办公中&#xff0c;Excel是我们使用频率最高的软件之一&#xff0c;但很多人只掌握了最基础的录入和简单计算功能&#xff0c;遇到一些“卡脖子”的小问题就束手无策&#xff0c;不得不手动折腾半天。其实&#xff0c;Excel中隐藏着不少实用的小技巧&#xff0c;能帮你轻…...

FLUX.1-dev像素生成器效果对比:不同Scale值对像素结构强度影响实测

FLUX.1-dev像素生成器效果对比&#xff1a;不同Scale值对像素结构强度影响实测 1. 像素艺术生成技术概述 像素幻梦&#xff08;Pixel Dream Workshop&#xff09;是基于FLUX.1-dev扩散模型构建的专业像素艺术生成工具。它采用16-bit现代明亮风格设计&#xff0c;为创作者提供…...

从零搭建AI办公助手:OpenClaw+百川2-13B-4bits七日实践计划

从零搭建AI办公助手&#xff1a;OpenClaw百川2-13B-4bits七日实践计划 1. 为什么选择这个组合&#xff1f; 去年冬天&#xff0c;当我第一次听说OpenClaw这个开源自动化框架时&#xff0c;内心是充满怀疑的。作为一个长期被各种"智能助手"忽悠的技术从业者&#xf…...

从XMind到禅道:定制化脚本实现测试用例高效导入

1. 为什么需要从XMind导入测试用例到禅道&#xff1f; 在日常测试工作中&#xff0c;XMind思维导图因其直观的结构和高效的编辑方式&#xff0c;成为很多测试工程师编写测试用例的首选工具。我自己也深有体会&#xff0c;用XMind梳理测试点特别顺手&#xff0c;一个下午就能完成…...

SEO_快速提升流量的五个SEO关键操作步骤

<h3 id"seoseo">SEO:快速提升流量的五个SEO关键操作步骤</h3> <p>在数字化时代&#xff0c;网站的流量直接影响着企业的市场竞争力。如何让你的网站在搜索引擎上排名靠前&#xff0c;吸引更多的访客&#xff0c;这是每个网站运营者都面临的重要课题…...