基于模板方法、工厂设计模式模拟聚合支付

什么是工厂模式

通过工厂方法获取接口的某个子类实例,一般工厂方法传beanId或class路径+反射获取

工厂模式优缺点

  • 优点

    代码结构简单。
    获取产品的过程更加简单。
    满足了开闭原则,即对拓展开放,对修改关闭。

  • 缺点

    拓展较繁琐,要拓展时,需同时改动抽象工厂和工厂实现类。

什么是模版方法

定义了一个操作中的算法的骨架,而将部分步骤的实现在子类中完成。

模板方法核心设计要点

AbstractClass : 抽象类,定义并实现一个模板方法。这个模板方法定义了算法的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类去实现
ConcreteClass : 实现实现父类所定义的一个或多个抽象方法。

模版方法应用场景

比如聚合支付平台中系统回调代码重构、Servlet 请求等

模式模式优缺点

  • 优点

    模板方法模式通过把不变的行为搬移到超类,去除了子类中的重复代码。子类实现算法的某些细节,有助于算法的扩展。通过一个父类调用子类实现的操作,通过子类扩展增加新的行为,符合“开放-封闭原则”。

  • 缺点

    每个不同的实现都需要定义一个子类,这会导致类的个数的增加,设计更加抽象。

基于模板方法、工厂设计模式模拟聚合支付环境搭建

application.yml
pom.xml
SpringUtils

AbstractPayCallbackTemplate

@Component
@Slf4j
public abstract class AbstractPayCallbackTemplate {
    /***定义共同行为骨架*/
    public  String asycCallback(){
        // 1. 支付回调验证参数
        Map verifySignatureMap = verifySignature();
        // 2. 参数验证成功,写入日志中..
        payLog(verifySignatureMap);
        String analysisCode = verifySignatureMap.get("analysisCode");
        if (!analysisCode.equals("200")) {
            return resultFail();
        }
        // 3. 执行回调异步相关逻辑
        return asyncService(verifySignatureMap);
    }
    /*** 支付回调验证参数*/
    protected abstract Map verifySignature();

    /*** 使用多线程异步写入日志*/
    @Async
    public void payLog(Map verifySignatureMap) {
        log.info(">>>>>>>>>>第二步 写入payLog........");
    }

    /*** 每个子类需要实现 实现业务解析操作*/
    protected abstract String asyncService(Map verifySignatureMap);

    /*** 异步返回结果*/
    protected abstract String resultSuccess();

    /*** 异步返回失败*/
    protected abstract String resultFail();
}

AliPayCallbackTemplate

@Component

@Slf4j
public class AliPayCallbackTemplate extends AbstractPayCallbackTemplate {
    @Override
    protected Map verifySignature() {
        //>>>>假设一下为银联回调报文>>>>>>>>>>>>>>>>
        log.info(">>>>>第一步 解析支付宝据报文.....verifySignature()");
        Map verifySignature = new HashMap<>();
        verifySignature.put("price", "1399");
        verifySignature.put("orderDes", "充值蚂蚁课堂永久会员");
        // 支付状态为1表示为成功....
        verifySignature.put("aliPayMentStatus", "1");
        verifySignature.put("aliPayOrderNumber", "201910101011");
        // 解析报文是否成功 200 为成功..
        verifySignature.put("analysisCode", "200");
        return verifySignature;
    }

    @Override
    protected String asyncService(Map verifySignatureMap) {
        log.info(">>>>>第三步asyncService()verifySignatureMap:{}", verifySignatureMap);
        String paymentStatus = verifySignatureMap.get("aliPayMentStatus");
        if (paymentStatus.equals("1")) {
            String aliPayOrderNumber = verifySignatureMap.get("aliPayOrderNumber");
            log.info(">>>>orderNumber:{aliPayOrderNumber},已经支付成功 修改订单状态为已经支付...");
        }
        return resultSuccess();
    }

    @Override
    protected String resultSuccess() {
        return "ok";
    }

    @Override
    protected String resultFail() {
        return null;
    }
}

TemplateFactory

@Component
public class TemplateFactory {
    @Autowired
    private SpringUtils springUtils;

    public AbstractPayCallbackTemplate getPayCallbackTemplate(String templateId) {
        AbstractPayCallbackTemplate payCallbackTemplate = (AbstractPayCallbackTemplate) springUtils.getBean(templateId);
        return payCallbackTemplate;
    }
}

FactoryTempleteApp

@SpringBootApplication
@EnableAsync
@RestController
@Slf4j
public class FactoryTempleteApp {
    public static void main(String[] args) {
        SpringApplication.run(FactoryTempleteApp.class, args);
    }

    @Autowired
    private TemplateFactory templateFactory;

    @RequestMapping(value = "/factory/{id}", method = RequestMethod.GET)
    public String factory(@PathVariable("id") String id) {
        log.info("beanid:{}", id);
        //id表示beanID
        return templateFactory.getPayCallbackTemplate(id).asycCallback();
    }
}

测试地址

http://localhost:8088/factory/aliPayCallbackTemplate

思想来源

你可能感兴趣的:(设计模式系列)