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 {
   

    @Override
    public 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 {
   

    @Override
    public 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 {
   

    @Autowired
    Map<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 {
   

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

}

调用


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

在这里插入图片描述

相关推荐

  1. Spring设计模式-实战篇策略模式 + 工厂模式

    2023-12-12 06:26:07       46 阅读
  2. 设计模式策略模式

    2023-12-12 06:26:07       54 阅读
  3. 设计模式策略模式

    2023-12-12 06:26:07       57 阅读
  4. 设计模式策略模式

    2023-12-12 06:26:07       46 阅读
  5. 设计模式策略模式

    2023-12-12 06:26:07       39 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-12 06:26:07       91 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-12 06:26:07       97 阅读
  3. 在Django里面运行非项目文件

    2023-12-12 06:26:07       78 阅读
  4. Python语言-面向对象

    2023-12-12 06:26:07       88 阅读

热门阅读

  1. 《C++新经典设计模式》之第9章 命令模式

    2023-12-12 06:26:07       57 阅读
  2. git 分支合并

    2023-12-12 06:26:07       65 阅读
  3. 在Arch Linux上安装yay

    2023-12-12 06:26:07       59 阅读
  4. Scala学习一:语法基础/数据类型/变量

    2023-12-12 06:26:07       62 阅读
  5. Spring Boot中JdbcTemplate多数据源配置

    2023-12-12 06:26:07       58 阅读
  6. Jenkins:持续集成与持续交付的自动化利器

    2023-12-12 06:26:07       59 阅读
  7. 运筹学经典问题(一):指派问题

    2023-12-12 06:26:07       53 阅读
  8. 字符串相似度计算:Jaro-Winkler算法实现

    2023-12-12 06:26:07       61 阅读