Java设计模式-策略模式(支付业务的优化)

article/2025/10/4 17:41:51

一、什么情况下使用策略模式

功能类似的业务功能,避免创建多个接口,大量if else 判断逻辑,简化代码

二、我以支付为例(支付方式有微信,支付宝支付)

1、新建策略抽象类或者接口
public interface ThirdPayStrategyService {/*** 第三方支付接口(微信 支付宝)* @param order* @param clientIp* @return*/Map<String,String> pay(Orders order, String clientIp);}
2、定义俩个实现类实现当前支付接口

wx支付实现类

@Service("wxPay")
@Slf4j
public class WxPayStrategyServiceImpl implements ThirdPayStrategyService {@Overridepublic Map<String, String> pay(Orders order, String clientIp) {Map<String,String> map=new HashMap<>();map.put("success","true");map.put("type","wxPay");log.info("微信支付启动");return map;}
}

支付宝支付实现类

@Service("aliPay")
@Slf4j
public class AliPayStrategyServiceImpl implements ThirdPayStrategyService {@Overridepublic Map<String, String> pay(Orders order, String clientIp) {Map<String,String> map=new HashMap<>();map.put("success","true");map.put("type","aliPay");log.info("支付宝支付启动");return map;}
}

3、定义执行策略类

@Component
@Slf4j
public class ThirdPayStrategyContext {@Autowiredprivate final Map<String, ThirdPayStrategyService> payMap=new HashMap<>();public Map<String,String> pullPay(Integer payType){log.info("策略对象={}", payMap);return payMap.get(PayTypeEnum.getPayTypeByCode(payType)).pay(new Orders(), "127.0.0.1");}}

俩种支付实现类对象会在spring的加载下自动注入到payMap中,map中key是service的名称 例如:@Service(“aliPay”)value 是对象的地址值

4、接口调用

@RestController
@RequestMapping("/test")
@Slf4j
public class WebController {@Autowiredprivate ThirdPayStrategyContext thirdPayStrategyContext;@GetMapping("/pay/{payType}")public String payTest(@PathVariable Integer payType) {Map<String, String> result = thirdPayStrategyContext.pullPay(payType);log.info("调用支付返回结果={} 传参={}", JSON.toJSONString(result), payType);return "success";}}

5、调用结果

在这里插入图片描述

在这里插入图片描述

附:枚举类

public enum PayTypeEnum {WX_PAY(1,"wxPay"),ALI_PAY(2,"aliPay");private Integer code;private String payType;PayTypeEnum() {}PayTypeEnum(Integer code, String payType) {this.code = code;this.payType = payType;}public Integer getCode(){return code;}public String getPayType(){return payType;}public static String getPayTypeByCode(Integer code){PayTypeEnum[] list = PayTypeEnum.values();for (PayTypeEnum payTypeEnum : list) {if(code.equals(payTypeEnum.code)){return payTypeEnum.payType;}}return null;}public static List<Integer> typeCodeList(){ArrayList<Integer> codeList = Lists.newArrayList();PayTypeEnum[] list = PayTypeEnum.values();for (PayTypeEnum payTypeEnum : list) {codeList.add(payTypeEnum.code);}return codeList;}
}

微信支付宝接入

支付模块-接入微信或支付宝


http://chatgpt.dhexx.cn/article/fvfCGACL.shtml

相关文章

java策略模式实战示例

现已放在gitee上,可以不下载直接参考一下即: https://gitee.com/zhang-xiao-xiang/zxx-pattern 日常碰到的业务概述 登录类型,支付类型,供应商渠道,不同等级会员享受的优惠券价格不一样,等等业务判断,大量if else导致拓展(侧重新增)极其困难,维护(侧重修改)自然是改起来头痛(…

【JAVA设计模式】策略模式

1.什么是策略模式&#xff1f; 策略模式是对算法的包装&#xff0c;是把使用算法的责任和算法本身分割开来&#xff0c;委派给不同的对象管理&#xff0c;相同的事情-----选择不用同方式 &#xff08;不同实现&#xff09;举例子&#xff0c;最终可以实现解决多重if判断问题。 …

java微信关注事件_java策略模式在接收微信事件推送上的具体应用

java策略模式&#xff0c;在我的认知中是根据不同选择执行不同的实现。通过if或者switch-case也能实现这种逻辑&#xff0c;但是代码冗余&#xff0c;可扩展性不强。 百度百科上的解释为策略模式作为一种软件设计模式&#xff0c;指对象有某个行为&#xff0c;但是在不同的场景…

Java设计模式之3种策略模式实现

一、什么是策略模式 所谓策略模式&#xff0c;就是定义了一组策略&#xff0c;分别封装在不同类中&#xff0c;每种策略都可以根据当前场景相互替换&#xff0c;从而使策略的变化可以独立于操作者。比如我们要去某个地方&#xff0c;会根据距离的不同来选择不同的出行方式&…

java8 策略模式_JAVA设计模式之策略模式

策略模式&#xff1a;在策略模式(Strategy Pattern)中&#xff0c;一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式中&#xff0c;我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对…

git如何提交代码

代码提交 代码提交一般有五个步骤&#xff1a; 1.查看目前代码的修改状态 2.查看代码修改内容 3.暂存需要提交的文件 4.提交已暂存的文件 5.同步到服务器 1. 查看目前代码的修改状态 提交代码之前&#xff0c;首先应该检查目前所做的修改&#xff0c;运行git status命令 a)…

修改git提交时间

问题描述&#xff1a; 修改git提交记录的时间 git脚本&#xff1a; 此方法使用github上的开源工具完成。感谢无私的奉献者&#xff01; 操作步骤&#xff1a; github上下载文件 解压文件夹&#xff0c;把git-redate文件置于git安装目录的\mingw64\libexec\git-core文件夹…

git提交时常用命令

git提交时常用命令 一、git命令 -- 本地仓库与远程仓库建立链接 git init &#xff08;初始化本地仓库&#xff09; git remote add origin 远程仓库网址 git remote -v (查看远程仓库) git remote rm origin (删除远程分支)-- checkout多种用法 git checkout 文件名 &#…

git提交分支

1. git提交分支相关 在本地新建分支&#xff0c;保证和远程分支一样 git checkout -b 分支名如果分支已存在&#xff0c;只需要切换的话 git checkout 分支名提交前先把代码拉下来更新一下&#xff0c;确保不会覆盖别人的代码 git pull origin 远程分支(如果有)解决冲突 git …

Git 的提交

1 提交对象 理解Git分支&#xff0c;就需要了解提交及在提交过程中产生的提交对象&#xff08;commit object&#xff09;。在进行提交时Git会存储一个提交对象&#xff0c;其中包含一个指针&#xff0c;它指向此次提交时暂存内容的快照。除此之外&#xff0c;提交对象中还包含…

git代码提交

代码提交 代码提交一般有五个步骤&#xff1a; 1.查看目前代码的修改状态 2.查看代码修改内容 3.暂存需要提交的文件 4.提交已暂存的文件 5.同步到服务器 1. 查看目前代码的修改状态 提交代码之前&#xff0c;首先应该检查目前所做的修改&#xff0c;运行git status命令 a…

【git提交】流程

1- git提交&#xff08;分支合并&#xff09;操作流程&#xff1a; git 提交代码到自己的分支&#xff0c;并合并到主分支的完整流程 分支 sml &#xff0c; 主分支&#xff0c; master 分支msl上操作 git status git add . git commit -m ‘xxxxxx’ git pull origin master…

git提交规范,规范自己的提交标准

为了规范我的git提交内容&#xff0c;提交的时候commit -m “备注的信息”&#xff0c;但是每个人的备注信息千奇百怪&#xff0c;为了统一&#xff0c;我们进行了git的规范。 首先要全局安装commitizen npm i -g commitizen4.2.4然后安装插件 npm i cz-customizable6.3.0…

git提交常用命令

git 安装 1.在终端&#xff0c;检查git是否安装 git --version 2.没有安装的话&#xff0c;去git官网&#xff0c;下载git 3.安装后&#xff0c;在终端&#xff0c;检查git是否安装 4设置用户名和邮件地址&#xff08;最好和github的用户名/邮箱保持一致 git config -…

Git 提交规范

1. 背景 Git 是目前世界上最先进的分布式版本控制系统&#xff0c;在我们平时的项目开发中已经广泛使用。而当我们使用Git提交代码时&#xff0c;都需要写Commit Message提交说明才能够正常提交。 git commit -m "提交"然而&#xff0c;我们平时在编写提交说明时&a…

git 提交命令(附加git常用命令)

一、提交到git仓库 1、进入git终端、输入git init指令、会在当前目录生成一个.git的文件夹 git init2、然后通过git status 查看&#xff0c;该指令作用是 列出修改过的(绿色标识)、新创建的(红色标识)、已经暂存但未提交的文件(白色标识) git status3、然后通过git add ind…

git提交

Git提交代码步骤 1.1 第1步&#xff1a;同步远程仓库代码&#xff1a;git pull 提交代码第1步&#xff1a;git pull 同步远程仓库代码到本地 git add / git commit代码之前首先git pull&#xff0c;需先从服务器上面拉取代码&#xff0c;以防覆盖别人代码&#xff1b;如果有…

你真的了解单点登录(SSO)吗? 单点登录实现方式

在程序开发中&#xff0c;特别是网站类开发&#xff0c;会接触到单点登录(SSO)&#xff0c;什么是单点登录&#xff1f;单点登录(SSO)有什么用&#xff1f;下面就来详细介绍一下。 1 单点登录 1.1 什么是单点登录 单点登录的英文名叫做&#xff1a;Single Sign On&#xff0…

单点测试与多点测试

最近在使用PAT与Codeup写程序玩&#xff0c;发现这两者的OJ方式不同。 PAT是单点测试&#xff0c;即输入一组测试用例即可输出结果&#xff0c; 而Codeup是多点测试&#xff0c;即输入所有测试用例后才会输出所有输出结果。 在这里写两个最简单的ab求和小程序来说明二者的区别…

什么是单点登录?如何理解单点登录

什么是单点登录&#xff1f; 什么是单点登录&#xff1f; 因为讲了Cookie&#xff0c;讲了Session&#xff0c;这里我觉得有必要说一下单点登录。我们先来看一下什么是单点登录&#xff1a;单点登录&#xff08;Single Sign On&#xff09;&#xff0c;简称为 SSO&#xff0c;…