模板方法模式

什么是模板方法模式

哈喽,大家好,我是花臂,今天给大家讲一下模板方法模式的实战案例。

简单来说就是有一个共同行为的骨架,然后不同的行为去子类中去实现,就是父类子类这么一个关系,骚easy的。

核心设计要点:

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

模板方法模式应用场景

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

具体代码实现

重构聚合支付平台支付回调,每个支付平台的回调的行为是一样的,但是具体的实现可能有不同的地方,下面我们用模板方法设计模式重构支付回调代码。

!抽象类

@Component
public abstract class AbstractPayCallbackTemplate {
 /**
  * 支付回调
  * @return
  */
 public String callback() {
  //解析支付回调
  Map<String, String> map = verifySignature();
  //支付成功写入日志
  write(map);
  String code = map.get("code");
  if (!code.equals("200")) {
   return fail();//支付失败返回支付失败
  }
  //修改订单状态及其他业务
  return retu(map);

 }
 protected abstract Map<String, String> verifySignature();//解析回调参数

 protected abstract String retu(Map<String, String> map);//订单支付成功执行其他操作

 protected abstract String fail();//失败返回

 protected abstract String success();//成功返回

 //写入日志操作
 private void write(Map<String, String> map) {
  System.out.println("写入日志成功");
 }
}

!具体子类实现1

/***
 * 模拟支付宝回调
 */
@Component
public class Alipay extends AbstractPayCallbackTemplate {

 @Override
 protected Map<String, String> verifySignature() {
  System.out.println("开始解析支付宝支付回调");
  HashMap<String, String> stringStringHashMap = new HashMap<>();
  stringStringHashMap.put("code", "200");//解析是否成功
  stringStringHashMap.put("status", "1");//支付是否成功
  return stringStringHashMap;
 }

 @Override
 protected String retu(Map<String, String> map) {
  String status = map.get("status");
  if (!status.equals("1")) {
   return fail();
  }
  System.out.println("订单状态已修改");
  return success();
 }

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

 @Override
 protected String success() {
  return "success";
 }
}

!具体子类实现2

/**
 * 模拟微信支付回调
 */
@Component
public class WeiChatPay extends AbstractPayCallbackTemplate {

 @Override
 protected Map<String, String> verifySignature() {
  HashMap<String, String> map = new HashMap<>();
  map.put("code","200");//解析是否成功
  map.put("status","1");//支付是否成功
  return map;

 }

 @Override
 protected String retu(Map<String, String> map) {
  if (!map.get("status").equals("1")){
   return fail();
  }
  System.out.println("订单状态已修改");
  return success();
 }

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

 @Override
 protected String success() {
  return "1";
 }
}

!bean工具类

@Component
public class SpringUtils implements ApplicationContextAware {

 private static ApplicationContext applicationContext;

 @Override
 public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {

  this.applicationContext = applicationContext;
 }

 //获取applicationContext
    public static ApplicationContext getApplicationContext(){
     return applicationContext;
    }

    //通过name获取 Bean.
    public static Object getBean(String name){
        return getApplicationContext().getBean(name);
    }

    //通过class获取Bean.
    public static <T> T getBean(Class<T> clazz){
        return getApplicationContext().getBean(clazz);
    }

    //通过name,以及Clazz返回指定的Bean
    public static <T> T getBean(String name,Class<T> clazz){
        return getApplicationContext().getBean(name, clazz);
    }

}

!FactroyTemplate

//使用工厂模式获取具体的template
public class FactroyTemplate {
 public  static AbstractPayCallbackTemplate getTeamplate(String aa) {

  AbstractPayCallbackTemplate template = SpringUtils.getBean(aa, AbstractPayCallbackTemplate.class);
  return template;

 }
}

!controller

@RestController
public class TemplateController {

 @RequestMapping("aa")
 public String dd(String aa){
  AbstractPayCallbackTemplate teamplate = FactroyTemplate.getTeamplate(aa);
  String callback = teamplate.callback();
  return callback;
 }
}

测试


ok,本次教程从实战的角度演示的如何使用模板方法设计重构代码,有什么疑问欢迎下方评论区留言!

本文参考蚂蚁课堂

评论区



© [2020] · Powered by Typecho · Theme by Morecho
鄂ICP备20005123号