模板方法设计模式和工厂模式

工厂模式:

     文章链接:https://blog.csdn.net/qq_21036901/article/details/81080420

      1.静态工厂模式,设计一个接口,不同的实现类实现接口(方法体是实现方法),用的时候new实现类。

      2.工厂方法模式,设计一个接口,不同的实现类实现接口(方法返回的是new实现)。分别直接用即可。就是把不同的方法拆出来了。直接new工厂即可。

      3.抽象工厂,零件接口,零件实现类,car工厂接口,不同的car工厂实现car工厂接口,实现的方法里new零件, 注意是在实现的方法里面new的零件。

      4.使用静态工厂优化抽象工厂

      5.反射优化抽象工厂

      spring用的就是抽象工厂

--------------------------------------------------------------01

      静态工厂+策略模式 实现解耦和创建对象使用对象分开

     new的操作在工厂中封装好的

-------------------------------------------------------------02

     spring很多地方用到工厂比如ioc,beanFactory。

      分析spring的的applicationContext.getBean("bean的id")。

      BeanFactory底下有很多的工厂。

-------------------------------------------------------------03

    模板方法:

         有共同的行为但是有细微的区别。

           1.暴露一个接口,提供第三方回调通知。

           2.多家支付回调通知参数报文不同但是行为相同,都是解析回调报文,修改支付状态为已成功。

           3.解析报文成功的话修改支付为成功

         流程:

            1.解析报文

             2.日志收集

             3. 解析报文成功的话修改支付为成功返回不同的结果(重试机制)

          策略:

                     相同的行为定义在抽象方法中,不同的行为子类去实现。   

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

模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

2.模板方法模式是所有模式中最为常见的几个模式之一,是基于继承的代码复用的基本技术,没有关联关系。 因此,在模板方法模式的类结构图中,只有继承关系。

核心设计要点:

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

ConcreteClass : 实现父类所定义的一个或多个抽象方法。

-------------------------------------------------------------04

     定义抽象的模板:

         设计的宗旨就是定义共同的行为骨架,相同的行为定义在抽象方法中,不同的行为子类去实现。

package com.mayikt.template;

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;


import java.util.Map;

/**
 * @author:fdy
 * @title: AbstractPayCallbackTemplate  抽象方法的模版
 * @description: 
 * @date 2019/5/1121:26
 */
@Slf4j
public abstract class AbstractPayCallbackTemplate {


    /**
     * 定义共同行为的骨架
     *
     * @return
     */
    public String asyncCallBack() {
        // 1.验证参数和验证签名
        Map<String, String> verifySignature = verifySignature();
        // 2.日志收集 相同
        payLog(verifySignature);
        // 3. 获取验证签名状态
        String analysisCode = verifySignature.get("analysisCode");
        if (!analysisCode.equals("200")) {
            return resultFail();
        }
        // 3.更改数据库状态同时返回不同支付结果
        return asyncService(verifySignature);
    }


    /**
     * 使用多线程异步写入日志
     *
     * @param verifySignature
     */
    @Async
    public void payLog(Map<String, String> verifySignature) {
        log.info("第二步骤 写入数据库....verifySignature:{}", verifySignature);
    }

    /**
     * 验证参数...
     *
     * @return
     */
    protected abstract Map<String, String> verifySignature();

    /**
     * 执行修改订单状态和返回不用的结果..
     *
     * @param verifySignature
     * @return
     */
    protected abstract String asyncService(Map<String, String> verifySignature);

    /**
     * 返回失败结果
     *
     * @return
     */
    protected abstract String resultFail();

    /**
     * 返回成功结果
     *
     * @return
     */
    protected abstract String resultSuccess();

}

-------------------------------------------------------------05

  

package com.mayikt.template.impl;

import com.mayikt.template.AbstractPayCallbackTemplate;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

/**
 * @author
 * @title: AliPayCallbackTemplate
 * @description:
 * @date 2019/5/1121:36
 */
@Slf4j
@Component
public class AliPayCallbackTemplate extends AbstractPayCallbackTemplate {
    @Override
    protected Map<String, String> verifySignature() {
        //>>>>假设一下为阿里pay回调报文>>>>>>>>>>>>>>>>
        log.info(">>>>>第一步 解析支付宝据报文.....verifySignature()");
        Map<String, String> verifySignature = new HashMap<>();
        verifySignature.put("price", "1399");
        verifySignature.put("orderDes", "充值蚂蚁课堂永久会员");
        // 支付状态为1表示为成功....
        verifySignature.put("aliPayMentStatus", "1");
        verifySignature.put("aliPayOrderNumber", "201910101011");
        //>>>>假设一下为阿里pay回调报文结束>>>>>>>>>>>>>>>>
        // 解析报文是否成功 或者验证签名成功返回 200 为成功..
        verifySignature.put("analysisCode", "200");
        return verifySignature;
    }

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

    @Override
    protected String resultFail() {
        return "fail";
    }

    @Override
    protected String resultSuccess() {
        return "success";
    }
}
package com.mayikt.template.impl;

import com.mayikt.template.AbstractPayCallbackTemplate;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

/**
 * @author 
 * @title: AliPayCallbackTemplate
 * @description: 
 * @date 2019/5/1121:36
 */
@Slf4j
@Component
public class UnionPayCallbackTemplate extends AbstractPayCallbackTemplate {
    @Override
    protected Map<String, String> verifySignature() {
        //>>>>假设一下为银联回调报文>>>>>>>>>>>>>>>>
        log.info(">>>>>第一步 解析银联据报文.....verifySignature()");
        Map<String, String> verifySignature = new HashMap<>();
        verifySignature.put("price", "1399");
        verifySignature.put("orderDes", "充值蚂蚁课堂永久会员");
        // 支付状态为1表示为成功....
        verifySignature.put("unionPayMentStatus", "1");
        verifySignature.put("unionPayOrderNumber", "201910101011");
        //>>>>假设一下为阿里pay回调报文结束>>>>>>>>>>>>>>>>

        // 解析报文是否成功 或者验证签名成功返回 200 为成功..
        verifySignature.put("analysisCode", "200");
        return verifySignature;

    }

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

        return resultSuccess();
    }

    @Override
    protected String resultFail() {
        return "fail";
    }

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

--------------------------------------------------------------06

       静态工厂模式获取模板

      

package com.mayikt.template.factory;

import com.mayikt.template.AbstractPayCallbackTemplate;
import com.mayikt.template.utils.SpringUtils;

/**
 * @author 
 * @title: TemplateFactory
 * @description: 
 * @date 2019/5/1121:49
 */
public class TemplateFactory {

    /**
     * 使用工厂模式获取模版
     *
     * @param templateId
     * @return
     */
    public static AbstractPayCallbackTemplate getPayCallbackTemplate(String templateId) {
        AbstractPayCallbackTemplate payCallbackTemplate = (AbstractPayCallbackTemplate) SpringUtils.getBean(templateId);
        return payCallbackTemplate;
    }
}

 调用

package com.mayikt.template.controller;

import com.mayikt.template.AbstractPayCallbackTemplate;
import com.mayikt.template.factory.TemplateFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author 
 * @title: TemplateController
 * @description: 
 * @date 2019/5/1121:53
 */
@RestController
public class TemplateController {

    /**
     * 支付回调
     *
     * @return
     */
    @RequestMapping("/asyncCallBack")
    public String asyncCallBack(String templateId) {
        AbstractPayCallbackTemplate payCallbackTemplate = TemplateFactory.getPayCallbackTemplate(templateId);
        // 使用模版方法模式 执行共同的骨架
        return payCallbackTemplate.asyncCallBack();
    }

}

--------------------------------------------------------------07     

  总结:

         策略模式针对的是不同的骨架是if的分支

--------------------------------------------------------------08

     servlet底层模板方法

----------------

参考链接:https://www.cnblogs.com/xingele0917/p/4835190.html

           

--------------------------------------------------------------09

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值