策略模式的小记

ops/2024/9/20 7:04:47/ 标签: 策略模式, java, 开发语言

策略模式

    • 策略模式
    • 支付系统【场景再现】
    • 硬编码完成不同的支付策略
    • 使用策略模式,对比不同
      • (1)支付策略接口
      • (2)具体的支付策略类
      • (3)上下文
      • (4)客户端
      • (5)小结

策略模式

定义:策略模式是一种行为设计模式,在运行时改变对象的行为。

目的:定义一系列算法,把它们一个个封装起来,并且使它们可相互替换。

结构:

  • 策略接口:声明了所有支持的所有算法的公共接口。
  • 具体策略:实现了策略接口中声明的算法
  • 上下文:使用某个具体策略实例时,通常上下文会提供一个接口供客户端调用,内部则根据设定的策略来执行相应的算法。

支付系统【场景再现】

场景:支付系统 ,支付系统拥有多种不同的支付策略(信用卡,支付宝支付,微信支付)

在这里插入图片描述

硬编码完成不同的支付策略

依据传入支付策略不同,进行大量的if...else判断,倘若后续加入其他的第三方支付策略,则需要接着if...else代码冗余,耦合度搞,难以扩展(添加新的支付方式,必须修改processPayment方法)

java">public class Payment {public void processPayment(double amount, String paymentMethod) {if ("creditCard".equals(paymentMethod)) {System.out.println("Paying " + amount + " using credit card.");} else if ("alipay".equals(paymentMethod)) {System.out.println("Paying " + amount + " using Alipay.");} else if ("wechat".equals(paymentMethod)) {System.out.println("Paying " + amount + " using WeChat.");} else {throw new IllegalArgumentException("Unsupported payment method: " + paymentMethod);}}
}

测试类:

java">public class Client {public static void main(String[] args) {Payment payment = new Payment();payment.processPayment(100.0, "creditCard");payment.processPayment(200.0, "alipay");payment.processPayment(300.0, "wechat");}
}

使用策略模式,对比不同

  • 定义一个支付策略接口
  • 实现具体的支付策略类
  • 创建一个上下文类来使用具体的支付策略

(1)支付策略接口

java">public interface PaymentStrategy {void pay(double amount);
}

(2)具体的支付策略类

  1. 信用卡支付策略
java">public class CreditCardPayment implements PaymentStrategy {@Overridepublic void pay(double amount) {System.out.println("Paying " + amount + " using credit card.");}
}
  1. 支付宝策略
java">public class AlipayPayment implements PaymentStrategy {@Overridepublic void pay(double amount) {System.out.println("Paying " + amount + " using Alipay.");}
}
  1. 微信支付策略
java">public class WeChatPayment implements PaymentStrategy {@Overridepublic void pay(double amount) {System.out.println("Paying " + amount + " using WeChat.");}
}

(3)上下文

java">public class PaymentContext {private PaymentStrategy paymentStrategy;// 构造器注入策略public PaymentContext(PaymentStrategy paymentStrategy) {this.paymentStrategy = paymentStrategy;}public void processPayment(double amount) {paymentStrategy.pay(amount);}
}

(4)客户端

java">public class Client {public static void main(String[] args) {// 创建不同的支付策略PaymentStrategy creditCardPayment = new CreditCardPayment();PaymentStrategy alipayPayment = new AlipayPayment();PaymentStrategy weChatPayment = new WeChatPayment();// 使用不同的支付策略PaymentContext context = new PaymentContext(creditCardPayment);context.processPayment(100.0);context = new PaymentContext(alipayPayment);context.processPayment(200.0);context = new PaymentContext(weChatPayment);context.processPayment(300.0);}
}

(5)小结

策略模式

  • 定义一个支付策略接口PaymentStrategy
  • 实现三个具体的支付策略类CreditCardPayment,AlipayPaymentWeChatPayment
  • 上下文类PaymentContext,来使用具体的支付策略
  • 客户端测试代码中动态选择不同的支付层策略

策略模式主要关注的是算法或行为的选择和封装。它允许在运行时动态地选择不同的算法或行为。

策略模式适用于需要在运行时选择不同的算法或行为的情况。例如,不同的排序算法、支付方式等。


http://www.ppmy.cn/ops/109837.html

相关文章

高效物流管理从固乔快递批量查询助手开始

固乔快递批量查询助手:物流管理的智能化升级 固乔快递查询助手:批量追踪,物流无忧 轻松应对海量单号,固乔快递批量查询助手来帮忙 跨境电商新利器:固乔快递批量查询助手 高效物流管理从固乔快递批量查询助手开始 …

安装FTP服务器教程

一。安装vsftpd yum install vsftpd 二。修改配置文件,匿名账户具有访问,上传和创建目录的权限 vim /etc/vsftpd/vsftpd.conf (红色进行设置放开YES) local_enable:本地登陆控制,no表示禁止,ye…

大模型的第一个杀手级应用场景出来了

大家终于都意识到大模型首先改变的是软件行业自己,而软件的根基是代码生成。代码生成第一波就是AI辅助开发,这个会是大模型第一个杀手级应用。大家苦苦逼问自己的大模型杀手级应用,为什么会是辅助编程,这里说下什么: 必…

i++与++i在for循环中效果一样?

首先说结果 是的,在Visual Studio 2022中,不同于直接printf,在for循环中的i与i是同样的效果(都当作了i) 这是编译器干的好事。 如图比对 i i 原因探寻 | i i的底层原理 找到一篇博客,我目前还看不太明…

Hive 本地启动时报错 Persistence Manager has been closed

Hive 本地启动时报错 Persistence Manager has been closed 2024-09-07 17:21:45 ERROR RetryingHMSHandler:215 - Retrying HMSHandler after 2000 ms (attempt 2 of 10) with error: javax.jdo.JDOFatalUserException: Persistence Manager has been closedat org.datanucle…

大二上学期详细学习计划

本学习完成目标: 项目: 书籍:《mysql必知必会》《java核心技术卷》(暂时)加强JavaSE的学习,掌握Java核心Mysqlsql(把牛客上的那50道sql语句题写完)gitmaven完成springboot项目&…

相机不小心格式化了怎么恢复?如何快速找回珍贵照片

在数字摄影时代,相机格式化是一个令人头疼的问题。一旦不小心执行了这个操作,珍贵的照片和视频可能会瞬间消失。然而,幸运的是,通过一些专业的方法,我们仍有可能恢复这些被误删的数据。接下来,本文将介绍四…

浅谈:CDN下真实IP的暴露

免责声明:本文仅做分享! 目录 CDN简介: 国内常见CDN: 国外常见CDN: 判断CDN存在? 在线ping检测: nslookup: 寻找真实IP----> 1-DNS历史解析纪录 2-子域名查询 1.在线平台查询 2.工具爆破 3.搜索引擎 3-网站邮件头信息 4-S…

Linux虚拟机安装(CentOS9)

需要自己设置一下内存,处理器,以及镜像文件 **************************************************************** 设置完硬件后,启动虚拟机,开始配置操作系统 选择英文 这里需要改三个地方 1. 2. 3. 设置root账户的密码 全部完…

Java复习【知识改变命运】第四章

数组 1.数组的创建2.数组的赋值机制3.二维数组的创建4.数组的赋值机制5.二维数组练习 1.数组的创建 动态初始化: 数据类型[] 数组名称new 数组名称[大小];静态初始化: 数据类型[] 数组名称{元素,元素,元素...};2.数组的赋值机制…

一看就懂!什么叫做深度合成算法备案

一看就懂!什么叫做深度合成算法备案 目前市场上比较热门的AIGC应用主要集中在图像和文本的生成领域。在图像生成方面,模型层面有Stable-diffusion,产品层面有MidJourney等。在文本生成方面,国外以OpenAI的ChatGPT为代表&#xff0…

Spring 循环依赖原理及解决方案

一、什么是循环依赖 循环依赖指的是一个实例或多个实例存在相互依赖的关系(类之间循环嵌套引用)。 举例: Component public class AService {// A中注入了BAutowiredprivate BService bService; }Component public class BService {// B中也…

Postman做接口测试时一些实用的操作

Postman 之前是作为Chrome 的一个插件,现在要下载应用才能使用。 以下是postman 的界面: 各个功能区的使用如下: 快捷区: 快捷区提供常用的操作入口,包括运行收藏夹的一组测试数据,导入别人共享的收藏夹测…

Ironic服务是什么;Ironic服务中用户镜像,租户怎么使用

目录 Ironic服务是什么 一、Ironic服务简介 二、Ironic服务的使用方法 1. 部署与配置 2. 注册与管理裸金属节点 3. 部署与监控 4. 插件与集成 三、使用场景 四、总结 Ironic服务中用户镜像,租户怎么使用 用户镜像的创建与准备 租户使用用户镜像 注意事项 Ironic服…

SpringCloud之Sleuth(Micrometer)+ZipKin分布式链路追踪

(学习笔记) 1、分布式链路追踪概述 问题:在微服务框架中,一个由客户端发起的请求在后端系统中会经过多个不同的的服务节点调用来协同产生最后的请求结果,每一个前段请求都会形成一条复杂的分布式服务调用链路&#xf…

传输层协议UDP

本篇将主要介绍 UDP 协议,介绍了有关 UDP 协议的报头、协议特点、UDP 协议在操作系统中的缓冲区、UDP 协议使用的注意事项,以及有关 UDP 的 Socket 编程程序,同时重点介绍了操作系统对于 UDP 协议报文的管理。 接着介绍了有关端口号的映射。 …

powerbi

一. CALCULATE 和 FILTER FILTER 返回的数据必须是表, 所以 可以 用在 新建表中, 不能直接用在度量值中其实 filter 相当于 用 外表字段 去进行筛选 不使用 filter, 只能使用本表字段 进行筛选,如下1, 只能使用 门店信…

cookie实战案例-自动登录网站

在写爬虫的时候,要伪装成真实用户请求。可能需要大量的IP地址,那么大量的IP地址从哪里来呢?这里就需要用代理IP来解决了,有的网站专门通过提供代理IP池服务作为主要的经营业务,只要注册相关网站开通对应套餐就可以了。…

Linux中的进程概念

Linux中的进程概念是操作系统核心功能之一,它对于理解系统如何管理和运行程序至关重要。以下是对Linux进程概念的详细解析,涵盖进程的定义、特性、状态、创建与终止、内存管理、优先级与调度等多个方面。 一、进程的定义 进程是Linux系统中运行中的程序…

深入浅出:Android屏幕刷新机制

if (status) {//初始化出现异常 String8 message;led to initialize display event receiver. status message.appendFormat(“Fai%d”, status); jniThrowRuntimeException(env, message.string()); return 0; } receiver->incStrong(gDisplayEventReceiverClassInfo.clazz…