策略模式业务实战

一、策略模式实现任务分发

1.新建策略接口

package com.ehe.elder.strategy;public interface ElderJobOrderStrategy {void notifyMethod(String outTradeNo);
}

2.新建策略实现类

@Slf4j
@Component
public class ElderJobOrderGranter implements ElderJobOrderStrategy {public static final String ELDET_JOB_ORDER = "FW-";@Overridepublic void notifyMethod(String outTradeNo) {//业务处理}
}
package com.ehe.elder.granter.order;import com.ehe.elder.strategy.ElderJobOrderStrategy;
import org.springframework.stereotype.Component;@Component
public class WeiLaoOrderGranter implements ElderJobOrderStrategy {public static final String WEI_LAO_TYPE = "";@Overridepublic void notifyMethod(String outTradeNo) {//业务实现}
}

3.新建策略工厂

package com.ehe.elder.builder;import com.ehe.core.exception.ResponseInfoException;
import com.ehe.core.http.HttpResponseStatus;
import com.ehe.core.http.ResponseInfo;
import com.ehe.core.util.SpringUtil;
import com.ehe.elder.granter.order.ElderJobOrderGranter;
import com.ehe.elder.granter.order.WeiLaoOrderGranter;
import com.ehe.elder.granter.order.YiJianTongOrderGranter;
import com.ehe.elder.strategy.ElderJobOrderStrategy;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;public class ElderJobOrderBuilder {private static Map<String, ElderJobOrderStrategy> strategyMap = new ConcurrentHashMap<>();static {strategyMap.put(ElderJobOrderGranter.ELDET_JOB_ORDER, SpringUtil.getBean(ElderJobOrderGranter.class));strategyMap.put(WeiLaoOrderGranter.WEI_LAO_TYPE,SpringUtil.getBean(WeiLaoOrderGranter.class));}public static ElderJobOrderStrategy getVolunteerType(String orderType){ElderJobOrderStrategy elderJobOrderStrategy = strategyMap.get(orderType);if (elderJobOrderStrategy == null) {throw ResponseInfoException.of(ResponseInfo.of(HttpResponseStatus.ORDER_PROCESS_NOT_EXISTS));} else {return elderJobOrderStrategy;}}
}

4.业务调用

ElderJobOrderBuilder.getVolunteerType(YiJianTongOrderGranter.YI_JIAN_TONG_ORDER).notifyMethod(outTradeNo);

二、元注解+策略管理器

1.策略接口

package com.ehe.elder.function.handler;import com.ehe.elder.domain.ElderJobOrder;
import com.ehe.elder.function.param.PayPramInfo;
import java.io.Serializable;public interface JobOrderHanlder<T,R> extends Serializable {void doHnalder(ElderJobOrder elderJobOrder, PayPramInfo payPramInfo);}

2.策略管理中心

package com.ehe.elder.function.manager;import cn.hutool.core.collection.CollectionUtil;
import com.ehe.elder.domain.ElderJobOrder;
import com.ehe.elder.function.annotation.JobOrderDuty;
import com.ehe.elder.function.handler.JobOrderHanlder;
import com.ehe.elder.function.param.PayPramInfo;
import org.springframework.core.annotation.AnnotationUtils;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;public class HandleChainManager {private Map<String, List<JobOrderHanlder>> handleMap;public void setHandleMap(List<JobOrderHanlder> handlerList) {handleMap = handlerList.stream().sorted(Comparator.comparingInt(h -> AnnotationUtils.findAnnotation(h.getClass(), JobOrderDuty.class).order())).collect(Collectors.groupingBy(handler -> AnnotationUtils.findAnnotation(handler.getClass(), JobOrderDuty.class).type()));}public <T, R> void executeHandle(String type, ElderJobOrder t, PayPramInfo p) {List<JobOrderHanlder> handlers = handleMap.get(type);if (CollectionUtil.isNotEmpty(handlers)) {for (JobOrderHanlder<T, R> handler : handlers) {handler.doHnalder(t,p);}}}
}

3.策略实现类实现积分处理


import com.alibaba.fastjson.JSONObject;
import com.ehe.core.thread.LocalVariable;
import com.ehe.core.util.SpringUtil;
import com.ehe.core.util.TimeUtils;
import com.ehe.elder.domain.ElderJobOrder;
import com.ehe.elder.enumeration.ElderConstant;
import com.ehe.elder.function.annotation.JobOrderDuty;
import com.ehe.elder.function.param.PayPramInfo;
import com.ehe.elder.function.util.OrderInfoUtil;
import com.ehe.elder.service.PolicyServerTypeService;
import com.ehe.elder.service.TimeBankPushService;
import com.ehe.elder.util.ValidateIDCard;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;@Slf4j
@Service
@JobOrderDuty(type = "JOB_ORDER_HANDLER",order = 0)
public class IntegralChainHandler implements JobOrderHanlder{private static final long serialVersionUID = -4841388671717166795L;@Overridepublic void doHnalder(ElderJobOrder elderJobOrder, PayPramInfo payPramInfo) {//业务处理}
}
package com.ehe.elder.function.handler;import cn.hutool.core.math.Money;
import com.ehe.core.http.ResponseInfo;
import com.ehe.elder.domain.ElderJobOrder;
import com.ehe.elder.enumeration.ElderConstant;
import com.ehe.elder.function.annotation.JobOrderDuty;
import com.ehe.elder.function.param.PayPramInfo;
import com.ehe.elder.function.util.OrderInfoUtil;
import com.ehe.elder.util.OrderNumUtil;
import com.ehe.pay.manager.PayManager;
import com.ehe.pay.vo.PayOrderVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;@Slf4j
@Service
@JobOrderDuty(type = "JOB_ORDER_HANDLER",order = 2)
public class VxPayChainHanler implements JobOrderHanlder{private static final long serialVersionUID = -3957365484396429232L;@Overridepublic void doHnalder(ElderJobOrder elderJobOrder, PayPramInfo payPramInfo) {//业务处理}
}

4.调用类

SpringUtil.getBean(HandleChainManager.class).executeHandle("JOB_ORDER_HANDLER",elderJobOrder,payPramInfo);

三、反射扫描策略接口

1.策略接口

package com.ehe.elder.strategy;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;public interface PayStrategy {/*** 支付前准备支付参数*/Map<String,String> prePay(Map<String, Object> map);/*** 支付后处理支付回调结果*/String afterPay(HttpServletRequest request);}

2.策略接口中间层处理公共逻辑

package com.ehe.elder.service.impl;
import com.ehe.elder.factory.PayStrategyFactory;
import com.ehe.elder.service.AbstractPayService;
import com.ehe.elder.strategy.PayStrategy;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;@Service
public class PayServiceImpl extends AbstractPayService {/*** 支付前准备支付参数*/@Overridepublic Map<String,String> prePay(Map<String, Object> map) {PayStrategy payStrategy = PayStrategyFactory.getStrategy(this.payType);if (payStrategy == null) {throw new RuntimeException("没有%s类型的支付策略...n"+this.payType);}return payStrategy.prePay(map);}/*** 支付后处理支付回调结果*/@Overridepublic String afterPay(HttpServletRequest request) {PayStrategy payStrategy = PayStrategyFactory.getStrategy(this.payType);return payStrategy.afterPay(request);}
}package com.ehe.elder.service;
import com.ehe.elder.strategy.PayStrategy;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;//@Scope()可以设置原型模式
public abstract class AbstractPayService implements PayStrategy {protected String payType;/*** 支付*/public Map<String,String> pay(String payType, Map<String, Object> map) {this.payType = payType;Map<String,String> resultMap = prePay(map);if (resultMap != null) {return resultMap;} else {return null;}}public String notifyPay(String payType, HttpServletRequest request) {this.payType = payType;return afterPay(request);}
}

3.策略业务处理接口

package com.ehe.elder.granter.pay;import com.alibaba.excel.util.DateUtils;
import com.ehe.core.annotation.Pay;
import com.ehe.core.util.TimeUtils;
import com.ehe.elder.domain.ElderJobOrderPayParam;
import com.ehe.elder.enumeration.ElderConstant;
import com.ehe.elder.enumeration.RedisKeyConstant;
import com.ehe.elder.service.*;
import com.ehe.elder.strategy.PayStrategy;
import com.ehe.pay.manager.AliPayManager;
import com.ehe.setting.manager.PropertySettingManager;
import com.google.gson.Gson;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.*;/*** 支付宝支付*/
@Slf4j
@Service
@Pay("orderAliPay")
//@ConditionalOnMissingBean(name = "elderOrderAliPay")
public class ElderOrderAliPay implements PayStrategy {@Overridepublic Map<String,String> prePay(Map<String, Object> map) {try {log.info("开始支付宝支付,请求参数:{}",map);log.info("支付宝预下单结束,结果:{}",result);return hashMap;}catch (Exception e){log.info("支付宝下单异常:{}",e.getMessage());return null;}}@SneakyThrows@Overridepublic String afterPay(HttpServletRequest request) {log.info("服务工单-支付宝回调=日期:{}", TimeUtils.ldtToStandardString(LocalDateTime.now()));return ElderConstant.SUCCESS_LOWER;}}

4.业务调用

@Slf4j
@RestController
public class ElderJobOrderControllerImpl/** 支付策略 service  */@Autowiredprivate AbstractPayService payService;Map<String,String> mapv =  payService.pay("orderVchatPay",map);
}

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

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

相关文章

【Leetcode】top 100 多维动态规划

62 不同路径 一个机器人位于一个 m x n 网格的左上角&#xff0c;机器人每次只能向下或者向右移动一步&#xff0c;机器人试图达到网格的右下角&#xff0c;问总共有多少条不同的路径&#xff1f; 分析&#xff1a;dp[i][j] 代表走到 (i, j) 的路径总和数 递推规律&#xff1a…

java.lang.String final

关于String不可变的问题&#xff1a;从毕业面试到现在&#xff0c;一个群里讨论的东西&#xff0c;反正码农面试啥都有&#xff0c;这也是我不咋喜欢面试代码&#xff0c;因为对于我而言&#xff0c;我并不喜欢这些面试。知道或不知道基本没啥含氧量&#xff0c;就是看看源代码…

构造函数调用规则

默认情况下&#xff0c;c编译器至少给一个类添加3个函数 1&#xff0e;默认构造函数(无参&#xff0c;函数体为空) 2&#xff0e;默认析构函数(无参&#xff0c;函数体为空) 3&#xff0e;默认拷贝构造函数&#xff0c;对属性进行值拷贝(“”号赋值) 构造函数调用规则如下&…

大数据,或称巨量资料

大数据&#xff0c;或称巨量资料&#xff0c;指的是在传统数据处理应用软件不足以处理的大或复杂的数据集。大数据也可以定义为来自各种来源的大量非结构化或结构化数据。从学术角度而言&#xff0c;大数据的出现促成广泛主题的新颖研究&#xff0c;这也导致各种大数据统计方法…

【ZooKeeper】2、安装

本文基于 Apache ZooKeeper Release 3.7.0 版本书写 作于 2022年3月6日 14:22:11 转载请声明 下载zookeeper安装包 wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0-bin.tar.gz解压 tar -zxvf apache-zookeeper-3.7.0-b…

【Python 48小时速成 8】函数

在 Python 中&#xff0c;函数是一段可重复调用的代码块&#xff0c;用于执行特定任务。函数可以接受参数并返回值。下面是函数的基本结构以及示例代码&#xff1a; # 示例代码一&#xff1a;定义一个简单的函数 def greet():print("Hello, World!") # 函数体内的代…

界面组态软件---昆仑通态

昆仑通态参考资料 HMI人机界面 昆仑通态专题&#xff08;三&#xff09;&#xff1a;MCGS嵌入版组态软件的报警 HMI触摸屏编程

数据结构从入门到精通——二叉树的实现

二叉树的实现 前言一、二叉树链式结构的实现1.1前置说明1.2二叉树的手动创建 二、二叉树的遍历2.1 前序、中序以及后序遍历二叉树前序遍历二叉树中序遍历二叉树后序遍历2.2 层序遍历练习 三、二叉树的具体代码实现二叉树的节点个数二叉树叶子节点个数二叉树第k层节点个数二叉树…

记录 Selenium 常用功能和API

目录 WebDriver 类 常用 APIWebElement 类 常用 API元素等待机制sleep()方法隐式等待显式等待重写 apply() 方法ExpectedConditions类中常用方法页面加载超时设置 浏览器操作控制浏览器操作Window 类Navigation 类 浏览器窗口的切换滚动条操作弹出框处理&#xff08;alert、con…

个人网站制作 Part 14 添加网站分析工具 | Web开发项目

文章目录 &#x1f469;‍&#x1f4bb; 基础Web开发练手项目系列&#xff1a;个人网站制作&#x1f680; 添加网站分析工具&#x1f528;使用Google Analytics&#x1f527;步骤 1: 注册Google Analytics账户&#x1f527;步骤 2: 获取跟踪代码 &#x1f528;使用Vue.js&#…

[AIGC] Apache HTTP服务器:历史与使用

Apache HTTP服务器&#xff1a;历史与使用 Apache HTTP服务器&#xff0c;通常我们简称为Apache&#xff0c;是一款流行且强大的开源Web服务器软件。它伴随互联网的快速成长&#xff0c;并承载了许多网站服务的运行和访问。通过最新的科技和广阔的功能&#xff0c;Apache服务器…

实体框架EF(Entity Framework)简介

实体框架EF&#xff08;Entity Framework&#xff09;简介 文章目录 实体框架EF&#xff08;Entity Framework&#xff09;简介一、概述二、O/R Mapping是什么采用O/R Mapping带来哪些好处 三、Entity Framework架构3.1 下图展示了Entity Framework的整体架构3.2 Entity Framew…

MyBatis:XML操作

&#x1f451;专栏内容&#xff1a;MyBatis⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、MyBatis XML方式1、配置数据库2、指明XML路径3、写持久层代码 二、基础操作1、新增2、删除3、更新4、查找Ⅰ、开启驼峰命…

配置视图解析器

我们在指定视图的时候路径是有重复的&#xff0c;重复的操作可以用视图解析器&#xff0c;让框架帮我们&#xff1a; mv.setViewName("/WEB-INF/view/show.jsp");mv.setViewName("/WEB-INF/view/other.jsp"); 配置视图解析器&#xff1a; 注册视图解析器:帮…

202112青少年软件编程(Scratch图形化)等级考试试卷(三级)

第1题:【 单选题】 下列程序哪个可以实现: 按下空格键, 播放完音乐后说“你好! ” 2 秒? ( ) A: B: C: D: 【正确答案】: C 【试题解析】 : 第2题:【 单选题】 执行下列程序, 变量 N 的值不可能是? ( ) A:1 B:4 C:5 D:6 【正确答案】: D 【试题解析】…

制作一个RISC-V的操作系统六-bootstrap program(risv 引导程序)

文章目录 硬件基本概念qemu-virt地址映射系统引导CSR![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/86461c434e7f4b1b982afba7fad0256c.png)machine模式下的csr对应的csr指令csrrwcsrrs mhartid引导程序做的事情判断当前hart是不是第一个hart初始化栈跳转到c语言的…

ES集群部署:定时清除last_run_metadata_path数据

文章目录 引言I crontab 周期自动执行相应命令1.1 crontab语法1.2 crontab 文件示例1.3 系统范围内的 crontab 文件II logstash2.1 conf 参考2.2 statement_filepath2.3 执行引言 需求: 每天定时删除logstash的last_run_metadata_path文件,间接清除last_run_metadata_path数据…

分治法排序:原理与C语言实现

分治法排序&#xff1a;原理与C语言实现 一、分治法与归并排序概述二、归并排序的C语言实现三、归并排序的性能分析四、归并排序的优化 在计算机科学中&#xff0c;分治法是一种解决问题的策略&#xff0c;它将一个难以直接解决的大问题&#xff0c;分割成一些规模较小的相同问…

Expert Prompting-引导LLM成为杰出专家

ExpertPrompting: Instructing Large Language Models to be Distinguished Experts 如果适当设计提示&#xff0c;对齐的大型语言模型&#xff08;LLM&#xff09;的回答质量可以显著提高。在本文中&#xff0c;我们提出了ExpertPrompting&#xff0c;以激发LLM作为杰出专家回…

运动想象 (MI) 迁移学习系列 (14) : EEGNet-Fine tuning

运动想象迁移学习系列:EEGNet-Fine tuning 0. 引言1. 主要贡献2. 提出的方法2.1 EEGNet框架2.2 微调 3. 实验结果3.1 各模型整体分类结果3.2 算法复杂度比较3.3 不同微调方法比较 4. 总结欢迎来稿 论文地址&#xff1a;https://www.nature.com/articles/s41598-021-99114-1#cit…