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

java设计模式---策略模式

策略模式的定义

策略设计模式是一种行为设计模式。当在处理一个业务时,有多种处理方式,并且需要再运行时决定使哪一种具体实现时,就会使用策略模式。

策略模式的类图:
在这里插入图片描述

策略模式的实现

在支付业务中,有三种付款方式,程序运行时使用哪种方式由用户选择,根据用户选择执行不同的逻辑。

  1. 首先,我们需要将支付方式这一行为抽象为一个策略接口,代表支付方式的抽象。
public interface PaymentStrategy {public void payment(BigDecimal amount);}
  1. 然后我们再针对需要支持的三种支付方式建立对应的策略实现类。

银行卡支付策略

public class CreditPaymentStrategy implements PaymentStrategy{@Overridepublic void payment(BigDecimal amount) {System.out.println("使用银行卡支付" + amount);// 去调用网联接口}
}

微信支付策略

public class WechatPaymentStrategy implements PaymentStrategy{@Overridepublic void payment(BigDecimal amount) {System.out.println("使用微信支付" + amount);// 调用微信支付API}
}

支付宝支付策略

public class AlipayPaymentStrategy implements PaymentStrategy {@Overridepublic void payment(BigDecimal amount) {System.out.println("使用支付宝支付" + amount);// 调用支付宝支付API}
}
  1. 然后重新实现我们的支付服务PaymentService。
public class PaymentService {/*** 将strategy作为参数传递给支付服务*/public void payment(PaymentStrategy strategy, BigDecimal amount) {strategy.payment(amount);}
}

我们将支付策略作为参数传递给支付服务,在支付服务中只需要按照运行时传的支付策略对象进行支付就可以了。

我们来测试一下使用策略模式之后的代码。

public class StrategyTest {public static void main(String[] args) {PaymentService paymentService = new PaymentService();// 使用微信支付paymentService.payment(new WechatPaymentStrategy(), new BigDecimal("100"));//使用支付宝支付paymentService.payment(new AlipayPaymentStrategy(), new BigDecimal("100"));}
}

运行结果:

在使用了策略模式之后,在我们的支付服务PaymentService中便不需要写复杂的if…else,如果需要新增加一种支付方式,只需要新增一个新的支付策略实现,这样就满足了开闭原则,并且对其他支付方式的业务逻辑也不会造成影响,扩展性很好。

JDK中使用策略模式的例子

在JDK中最经典的使用策略模式的例子就是Collections.sort(List<T> list, Comparator<? super T> c)方法,这个方法接受一个比较器Compartor参数,客户端在运行时可以传入一个比较器的实现,sort()方法中根据不同实现,按照不同的方式进行排序。

总结:

  • 如果在一个系统里面有许多类,它们仅仅在行为上有区别,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为;
  • 一个系统需要动态地在几种算法中选择一种;
  • 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

相关文章:

java设计模式---策略模式

策略模式的定义 策略设计模式是一种行为设计模式。当在处理一个业务时&#xff0c;有多种处理方式&#xff0c;并且需要再运行时决定使哪一种具体实现时&#xff0c;就会使用策略模式。 策略模式的类图&#xff1a; 策略模式的实现 在支付业务中&#xff0c;有三种付款方式&…...

5-redis集群搭建安装

1.先决条件 1.1.OS基础配置 CentOS为了能够正常安装redis,需要对CentOS进行常规的一些基础配置,主要有:关闭防火墙与selinux,设置主机名,配置虚拟机IP地址使其能够与外网ping通,配置IP地址与主机名映射,配置yum源。具体配置参见: Linux常规基础配置_小黑要上天的博客…...

(数字图像处理MATLAB+Python)第十一章图像描述与分析-第七、八节:纹理描述和其他描述

文章目录 一&#xff1a;纹理描述&#xff08;1&#xff09;联合概率矩阵法A&#xff1a;定义B&#xff1a;基于联合概率矩阵的特征C&#xff1a;程序 &#xff08;2&#xff09;灰度差分统计法A&#xff1a;定义B&#xff1a;描述图像特征的参数 &#xff08;3&#xff09;行程…...

MySQL提权

参考&#xff1a; mysql提权篇 | Wh0ales Blog MySQL 提权方法整理 - Geekbys Blog MySQL_UDF提权漏洞复现-云社区-华为云 MYSQL UDF手动提权及自动化工具使用_udf提权工具_小直789的博客-CSDN博客 MySQL提权的三种方法 - FreeBuf网络安全行业门户 ......

FPGA优质开源项目 – UDP万兆光纤以太网通信

本文开源一个FPGA项目&#xff1a;UDP万兆光通信。该项目实现了万兆光纤以太网数据回环传输功能。Vivado工程代码结构和之前开源的《UDP RGMII千兆以太网》类似&#xff0c;只不过万兆以太网是调用了Xilinx的10G Ethernet Subsystem IP核实现。 下面围绕该IP核的使用、用户接口…...

如何中mac上安装多版本python并配置PATH

摘要 mac 默认安装的python是 python3&#xff0c;但是如果我们需要其他python版本时&#xff0c;该怎么办呢&#xff1f; 例如&#xff1a;需要python2 版本&#xff0c;如果使用homebrew安装会提示没有python2。同时使用python --version 会发现commond not found。 所以本…...

window 常用基础命令

0、起步 0-1) 获取命令的参数指引 netstat /? 0-2) 关于两个斜杠&#xff1a; window 文件路径中使用反斜杠&#xff1a;\ linux 文件路径中使用&#xff1a;/ 1、开关机类指令 shutdown /s # 关机shutdown /r # 重启shutdown /l …...

lintcode 1815 · 警报器 【simple vip 前缀和数组】

题目 https://www.lintcode.com/problem/1815 一个烟雾警报器会监测len秒内的烟雾值&#xff0c;如果这段时间烟雾值平均值大于k那么警报器会报警。现在给你n个数代表刚开始工作n秒内警报器监测的烟雾值&#xff08;警报器从第len秒开始判断是否报警&#xff09;&#xff0c;…...

【强化学习】MDP马尔科夫链

基本元素 状态集&#xff1a;表示智能体所处所有状态的全部可能性的集合。类似的集合&#xff0c;行为集&#xff0c;回报集决策&#xff1a;规定我在某个状态下&#xff0c;我做出某个action马尔可夫链&#xff1a;学术上来说是无记忆性质。说白了就是我只在乎我目前的状态。…...

SpringBoot自写项目记录

设置静态资源映射 Slf4j 用来打印日志 Configuration Slf4j //设置静态资源映射 public class WebMvcConfig extends WebMvcConfigurationSupport {Overrideprotected void addResourceHandlers(ResourceHandlerRegistry registry) {log.info("开始静态资源配置");r…...

Windows10上使用llama-recipes(LoRA)来对llama-2-7b做fine-tune

刚刚在Windows10上搭建环境来对llama2做finetune&#xff0c;里面坑还是挺多的&#xff0c;这里把印象中的坑整理了一下以作备忘。 llama-recipes是meta的开源项目&#xff0c;Github地址为&#xff1a;GitHub - facebookresearch/llama-recipes: Examples and recipes for Ll…...

06-限流策略有哪些,滑动窗口算法和令牌桶区别,使用场景?【Java面试题总结】

限流策略有哪些&#xff0c;滑动窗口算法和令牌桶区别&#xff0c;使用场景&#xff1f; 常见的限流算法有固定窗口、滑动窗口、漏桶、令牌桶等。 6.1 固定窗口 概念&#xff1a;固定窗口&#xff08;又称计算器限流&#xff09;&#xff0c;对一段固定时间窗口内的请求进行…...

2021年06月 C/C++(六级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C++编程(1~8级)全部真题・点这里 第1题:逆波兰表达式 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3。逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 …...

Tuxera NTFS for Mac2023苹果电脑Mac硬盘读写工具

Tuxera NTFS for Mac是一款高效稳定的NTFS读写工具&#xff0c;可以让你在Mac上完整地读写兼容NTFS格式驱动器&#xff0c;对磁盘进行访问、编辑、存储和传输文件等操作。Tuxera NTFS for Mac软件是一款高效稳定的NTFS读写工具&#xff0c;可以让你在Mac上完整地读写兼容NTFS格…...

系统调用的过程

系统调用也是库函数的底层实现&#xff0c;当高级语言代码中如调用了库函数&#xff0c;在编译为机器语言指令后&#xff0c;指令包含前期处理相关命令、传参指令、陷入指令、后续处理相关指令。在执行陷入指令时发生内中断&#xff0c;使CPU进入核心态&#xff0c;执行对系统调…...

Python将多个文件的名称或后缀名由大写字母修改为小写的方法

本文介绍基于Python语言&#xff0c;基于一个大文件夹&#xff0c;遍历其中的多个子文件夹&#xff0c;并对于每一个子文件夹中的大量文件&#xff0c;批量将其文件的名称或后缀名中的字母由大写修改为小写的方法。 本文期望实现的需求为&#xff1a;现有一个大文件夹&#xff…...

Debezium的三种部署方式

Debezium如何部署 debezium 有下面三种部署方式,其中最常用的就是 kafka connect。 kafka connect 一般情况下,我们通过 kafka connect 来部署 debezium,kafka connect 是一个框架和运行时: source connectors:像 debezium 这样将记录发送到 kafka 的source connectors…...

通讯协议057——全网独有的OPC HDA知识一之接口(十二)IOPCHDA_DataCallback

本文简单介绍OPC HDA规范的IOPCHDA_DataCallback&#xff08;客户端接口&#xff09;接口方法&#xff0c;更多通信资源请登录网信智汇(wangxinzhihui.com)。 1&#xff09;HRESULT OnDataChange(dwTransactionID, hrStatus, dwNumItems, pItemValues, phrErrors) 此方法由客…...

后端SpringBoot+前端Vue前后端分离的项目(一)

前言&#xff1a;后端使用SpringBoot框架&#xff0c;前端使用Vue框架&#xff0c;做一个前后端分离的小项目&#xff0c;需求&#xff1a;实现一个表格&#xff0c;具备新增、删除、修改的功能。 目录 一、数据库表的设计 二、后端实现 环境配置 数据处理-增删改查 model…...

docker 安装 MySQL5.7

1、拉取镜像 docker pull mysql:5.7 2、创建容器 docker run \ -d \ -p 3306:3306 \ --name mysql \ --privilegedtrue \ -v /var/docker/mysql/log:/var/log/mysql \ -v /var/docker/mysql/data:/var/lib/mysql \ -v /var/docker/mysql/conf:/etc/mysql/conf.d \ -e MYSQL_…...

WordPress主题开发实战:从零开始搭建你的第一个自定义主题(2024最新版)

WordPress主题开发实战&#xff1a;从零开始搭建你的第一个自定义主题&#xff08;2024最新版&#xff09; 如果你正准备踏入WordPress主题开发的世界&#xff0c;这篇文章将带你从零开始构建一个完整的自定义主题。不同于简单的仿制或修改现有主题&#xff0c;我们将深入探讨如…...

【Linux信号】Linux进程信号(上):信号产生方式和闹钟

&#x1f3ac; 个人主页&#xff1a;艾莉丝努力练剑❄专栏传送门&#xff1a;《C语言》《数据结构与算法》《C/C干货分享&学习过程记录》 《Linux操作系统编程详解》《笔试/面试常见算法&#xff1a;从基础到进阶》《Python干货分享》⭐️为天地立心&#xff0c;为生民立命…...

B端拓客号码核验行业:痛点剖析、技术突围与发展思考氪迹科技法人 号码筛选系统,阶梯式价格

B端拓客的效率与质量&#xff0c;很大程度上取决于核心决策人触达的精准度&#xff0c;而企业法人、股东、董监高等群体的有效联系方式&#xff0c;正是打通这一环节的关键。作为拓客工作的前置基础性步骤&#xff0c;号码核验的质量直接关联拓客投入的回报效率&#xff0c;更是…...

Qt操作Excel避坑指南:为什么我放弃了QAxObject而选择QXlsx?

Qt操作Excel的终极方案&#xff1a;从QAxObject到QXlsx的技术迁移实战 三年前接手一个工业数据采集项目时&#xff0c;我遇到了职业生涯中最棘手的Excel导出问题。客户现场同时安装了Office 2016和WPS&#xff0c;导致基于QAxObject开发的报表模块随机崩溃。更糟的是&#xff0…...

为什么你的Flask农业API总在灌溉高峰期崩?Python高并发部署的4层熔断架构设计(实测QPS提升6.8倍)

第一章&#xff1a;为什么你的Flask农业API总在灌溉高峰期崩&#xff1f;Python高并发部署的4层熔断架构设计&#xff08;实测QPS提升6.8倍&#xff09; 当全省智能灌溉系统在每日清晨5:00–7:00集中调度水阀、上传土壤墒情数据时&#xff0c;基于默认配置的Flask API常出现进程…...

做了十几年财务,我用RPA把最累的工作交给了“机器人”

在财务这行摸爬滚打了十几年&#xff0c;算是一路看着这个行业慢慢“进化”过来的&#xff1a;从最早拿计算器对数据&#xff0c;到后来用电脑做账&#xff0c;从手工账本过渡到ERP系统&#xff0c;再到这两年铺天盖地的“数智化转型”。中间也确实尝试过不少所谓的“黑科技”。…...

OpenClaw智能截图:nanobot自动识别图片中的文字信息

OpenClaw智能截图&#xff1a;nanobot自动识别图片中的文字信息 1. 为什么需要智能截图工具 在日常工作和学习中&#xff0c;我们经常遇到需要从图片中提取文字的场景。比如截取网页上的技术文档片段、保存会议白板上的讨论要点、或者整理纸质书籍中的关键段落。传统做法是手…...

OpenClaw技能市场盘点:10个适配Qwen3.5-4B-Claude的实用工具

OpenClaw技能市场盘点&#xff1a;10个适配Qwen3.5-4B-Claude的实用工具 1. 为什么需要关注技能适配性 当我第一次在OpenClaw上尝试安装第三方技能时&#xff0c;遇到了一个典型问题&#xff1a;技能安装成功了&#xff0c;但执行时模型总是输出"我不明白这个请求"…...

asp毕业设计下载(全套源码+配套论文)——基于asp+access的仓储物流管理系统设计与实现

基于aspaccess的仓储物流管理系统设计与实现&#xff08;毕业论文程序源码&#xff09; 大家好&#xff0c;今天给大家介绍基于aspaccess的仓储物流管理系统设计与实现&#xff0c;更多精选毕业设计项目实例见文末哦。 文章目录&#xff1a; 基于aspaccess的仓储物流管理系统…...

COA - CNN - BiGRU - Attention分类:新手友好的数据预测方案

COA-CNN-BiGRU-Attention分类 基于浣熊优化算法优化卷积神经网络(CNN)-双向门控循环单元(BGRU)结合注意力机制(Attention)的数据分类预测(可更换为回归/单变量/多变量时序预测&#xff0c;前私)&#xff0c;Matlab代码&#xff0c;可直接运行&#xff0c;适合小白新手 无需更改…...