策略模式基本概念:
- 一個接口或者抽象類,里面兩個方法(一個方法匹配類型,一個可替換的邏輯實現方法)
- 不同策略的差異化實現(就是說,不同策略的實現類)
使用策略模式替換判斷,使代碼更加優雅。
實現:
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);}