spring结合设计模式之策略模式

策略模式基本概念:

  • 一个接口或者抽象类,里面两个方法(一个方法匹配类型,一个可替换的逻辑实现方法)
  • 不同策略的差异化实现(就是说,不同策略的实现类)

使用策略模式替换判断,使代码更加优雅。

实现:

package com.demo.service.sjms;import com.demo.utils.Result;import java.util.Map;public interface InvoiceKj {Result service(Map param) ;
}
package com.demo.service.sjms;import com.demo.utils.Result;
import com.demo.utils.ResultUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;import java.util.Map;@Slf4j
@Component("QDP-FP-10001")
public class InvoiceQdpFp10001  implements InvoiceKj {@Overridepublic Result service(Map param)  {log.info("serviceid===>{}",param.get("serviceid"));log.info("蓝票申请");return ResultUtil.fail("不支持此开票类型!");}}
package com.demo.service.sjms;import com.demo.utils.Result;
import com.demo.utils.ResultUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;import java.util.Map;@Slf4j@Component("QDP-FP-10002")
public class InvoiceQdpFp10002 implements InvoiceKj {@Overridepublic Result service(Map param)  {log.info("serviceid===>{}",param.get("serviceid"));log.info("纸票待开号码查询");return ResultUtil.fail("不支持此开票类型!");}}
package com.demo.service.sjms;import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;@Slf4j
@Component
public class InvoiceKjFactory {@AutowiredMap<String, InvoiceKj> invoiceKjs = new ConcurrentHashMap<>(36);public InvoiceKj getInstance(String serviceid)  {InvoiceKj invoiceKj = invoiceKjs.get(serviceid);return invoiceKj;}
}
package com.demo.service.sjms;import com.demo.utils.Result;import javax.servlet.http.HttpServletRequest;public interface InvoiceOpenApiService {/***  发票业务* @param request* @return*/Result<String> service(String serviceid, HttpServletRequest request);
}
package com.demo.service.sjms;import cn.hutool.json.JSONObject;
import com.demo.utils.Result;
import com.demo.utils.ResultUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import javax.servlet.http.HttpServletRequest;@Slf4j
@Service("invoiceOpenApiService")
public class InvoiceOpenApiServiceImpl  implements InvoiceOpenApiService {@Autowiredprivate InvoiceKjFactory invoiceKjFactory;public Result<String> service(String serviceid, HttpServletRequest request) {//1、处理请求参数log.info("==> 同步开票对外接口,请求参数:{}",serviceid);//3、校验应用及验签JSONObject json = new JSONObject();json.put("serviceid", serviceid);//5、分发调用业务接口Result ret = ResultUtil.success(invoiceKjFactory.getInstance(serviceid).service(json));return ret;}}

调用

@GetMapping("/invoiceOpenApiService")public Result bbb(String serviceid, HttpServletRequest request) {return invoiceOpenApiService.service(serviceid, request);}

在这里插入图片描述

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

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

相关文章

C语言三种循环输出9*9乘法表

解题思路&#xff1a; 1、外层循环控制1~9循环 2、内层控制循环的次数 比如&#xff1a; 1 * 1 1 循环一次 1 * 1 1 1 * 2 循环两次 依此类推 int i, j;printf("for 打印9*9乘法表\r\n");for(i 1; i <10; i) {for(j 1; j < i;j) {printf("%d * %d %d…

RocketMQ-RocketMQ高性能核心原理节点(流程图)

NamesrvServer启动流程图&#xff1a; namesrvServer启动简图&#xff1a; Broker服务启动过程流程图 Broker服务启动过程流程简图 整体RPC框架流程如下图 client: DefaultMQProducer

HarmonyOS编译开源native库(OpenSSL实例)

前言 近期项目要开始做鸿蒙版本&#xff0c;有一部分依赖native的代码也需要迁移&#xff0c;某个native模块依赖openssl&#xff0c;需要在鸿蒙下重新编译openssl才行。一开始找了很多相关文档都没有得到方法&#xff0c;无奈只能自己凭经验慢慢试&#xff0c;最后还是成功了…

wvp gb28181 pro 配置https访问

准备工作 必须要有域名。虽然数字证书也有ip证书,但是会很麻烦,多数ca机构验证服务器需要用到80或443端口,也就是必须先备案,所以最好还是使用域名证书。购买域名证书。根据安全级别要求自行配置。单域名(不支持通配符的),阿里云的域名都是可以免费申请的。完成域名到服…

1-存储概念与SAN

任务背景 随着某些业务数据的增大, 公司服务器硬盘空闲空间越来越小, 服务器上也无法再拓展硬盘, 所以我们考虑使用网络存储方式远程共享存储给服务器使用。 任务要求 实现存储通过远程共享给应用服务器使用 任务拆解 1, 需要知道存储有哪些方式可以通过网络共享给服务器使…

【LLM】大模型之RLHF和替代方法(DPO、RAILF、ReST等)

note SFT使用交叉熵损失函数&#xff0c;目标是调整参数使模型输出与标准答案一致&#xff0c;不能从整体把控output质量&#xff0c;RLHF&#xff08;分为奖励模型训练、近端策略优化两个步骤&#xff09;则是将output作为一个整体考虑&#xff0c;优化目标是使模型生成高质量…

使用yum/dnf管理软件包

本章主要介绍使用 yum 对软件包进行管理。 yum 的介绍搭建yum源创建私有仓库yum客户端的配置yum的基本使用使用第三方yum源 使用rpm安装包时经常会遇到一个问题就是包依赖&#xff0c;如下所示。 [rootrhel03 ~]# rpm -ivh /mnt/AppStream/Packages/httpd-2.4.37-41.modulee…

12.10_黑马数据结构与算法笔记Java

目录 058 链表 e10 判环算法1 thinking&#xff1a;什么是空指针&#xff1f; 058 链表 e10 判环算法2 059 数组 e01 合并有序数组1 059 数组 e01 合并有序数组2 060 队列 链表实现1 061 队列 链表实现2 062 队列 环形数组实现 方法1-1 063 队列 环形数组实现 方法1-2…

MySQL使用窗口函数ROW_NUMBER()、DENSE_RANK()查询每组第一名或每组前几名,窗口函数使用详解

MySQL数据表结构 创建 tbl_class_info 表&#xff0c;表中有四个字段 id、username、score、group_name 使用 ROW_NUMBER()、DENSE_RANK() 查询每组前三名 -- 查询每组前3名 SELECT username, score, group_name FROM ( SELECT username, score, group_name, ROW_NUMBER()…

深入理解JVM虚拟机第二十八篇:详解JVM当中方法重写的本质和虚方法表

&#x1f609;&#x1f609; 欢迎加入我们的学习交流群呀&#xff1a; ✅✅1&#xff1a;这是孙哥suns给大家的福利&#xff01; ✨✨2&#xff1a;我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 &#x1f96d;&#x1f96d;3&#xff1a;QQ群&a…

java--Object

1.Object类的作用 Object类是java中所有类的祖宗类&#xff0c;因此&#xff0c;java中所有类的对象都可以直接使用Object类中提供一些方法 2.Object类的常见方法 ①toString存在的意义&#xff1a;toString()方法存在的意义就是为了被子类重写&#xff0c;以便返回对象具体的…

域渗透之DCSYNC攻击

文章目录 Dcsync详解Dcsync原理权限利用条件利用方式mimikatz后门利用使用Empire下的powerview.ps1脚本执行以上三条ACE Dcsync可逆加密存储密码得MachineAccount口令hash的方法使用DCSync导出所有帐户的hash防御 Dcsync详解 在Dcsync没有出现之前&#xff0c;如果攻击者需要拿…