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

策略模式基本概念:

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

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

实现:

bash 复制代码
package com.demo.service.sjms;

import com.demo.utils.Result;

import java.util.Map;


public interface InvoiceKj {

    Result service(Map param) ;
}
bash 复制代码
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 {

    @Override
    public Result service(Map param)  {
        log.info("serviceid===>{}",param.get("serviceid"));
        log.info("蓝票申请");
        return ResultUtil.fail("不支持此开票类型!");
    }

}
bash 复制代码
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 {

    @Override
    public Result service(Map param)  {
        log.info("serviceid===>{}",param.get("serviceid"));
        log.info("纸票待开号码查询");
        return ResultUtil.fail("不支持此开票类型!");
    }


}
bash 复制代码
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 {

    @Autowired
    Map<String, InvoiceKj> invoiceKjs = new ConcurrentHashMap<>(36);

    public InvoiceKj getInstance(String serviceid)  {
        InvoiceKj invoiceKj = invoiceKjs.get(serviceid);
        return invoiceKj;
    }
}
bash 复制代码
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);
}
bash 复制代码
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 {

    @Autowired
    private 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;
    }

}

调用

bash 复制代码
    @GetMapping("/invoiceOpenApiService")
    public Result bbb(String serviceid, HttpServletRequest request) {
        return invoiceOpenApiService.service(serviceid, request);
    }
相关推荐
Rain的Java大神之路4 小时前
介绍一下分布式事务
java·分布式·后端·spring·spring cloud·架构·springcloud
AI人工智能+电脑小能手12 小时前
大白话说Java设计模式-26-策略模式(业务实战篇)
java·spring·设计模式·策略模式·支付系统·算法切换
刀锋000114 小时前
Java 工程师转 AI Agent 最短路径:用 Spring 的思维理解 Spring AI 2.0(附 LangChain4j 对照)
java·人工智能·spring boot·spring·ai agent
重生之我是Java开发战士15 小时前
【Java EE】Spring AOP :面向切面编程
java·spring·java-ee
凤山老林15 小时前
基于 Spring Batch 的海量数据迁移与批处理架构:分片、容错与断点续跑
java·spring boot·spring·架构·spring batch
gis开发之家16 小时前
Spring Boot 4 深度解析——参数接收大全:@RequestParam、@PathVariable、@RequestBody
java·spring boot·后端·spring
(轻舟已过万重山)17 小时前
D1 · 融合蓝图:Spring AI + 虚拟线程 + 服务网格——现代后端统一底座
java·人工智能·spring
星火102417 小时前
【Groovy翻译-进阶篇】Groovy 中的设计模式
后端·设计模式·groovy
AI人工智能+电脑小能手17 小时前
大白话说Java设计模式-27-策略模式(源码剖析篇)
java·spring·设计模式·策略模式·源码分析·事务管理·comparator
音符犹如代码17 小时前
Varnish Cache 实战:反向代理缓存原理与 VCL 配置
java·spring·缓存