设计模式-模板方法

模板方法模式是一种行为设计模式, 它在超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。

有两种类型的步骤:

  • 抽象步骤必须由各个子类来实现
  • 可选步骤已有一些默认实现, 但仍可在需要时进行重写

继续优化策略模式中的支付策略,由于不同的支付的总的处理过程都是一样的:先构造参数,再对参数进行签名,发起支付请求,最后解析返回结果。因此可以应用模板方法。

首先定义一个抽象类如下:Pay

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public abstract class Pay {
// 模板(算法框架,超类定义好,子类不可修改)
public String exec(Map<String, Object> param) {
// step1: 根据输入参数组合支付请求需要的参数,不同的支付传入的参数不同,组合出来的参数也不同
Map<String, Object> urlParam = genUrlParam(param);
// step2: 对url参数进行签名,签名方法有很多:比如RSA,MD5,AES...
String sign = genSign(urlParam);
urlParam.put ( "sign", sign );
// step3: 发起支付请求,支付发起方式GET,POST
String result = callPayUrl(urlParam);
// step4: 解析请求结果并返回,返回结果有很多类型:XML,JSON,自定义结构...
return parseResult(result);
}

protected abstract Map<String, Object> genUrlParam(Map<String, Object> param);

protected abstract String genSign(Map<String, Object> param);

protected abstract String callPayUrl(Map<String, Object> param);

protected abstract String parseResult(String result);

//除此以外,模板超类中还可以定义默认实现,子类也可以根据情况覆写
}

然后在具体的继承类中实现特定的步骤也即实现抽象类中的抽象方法。

定义具体的实现类之微信支付:WeChatPay

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@Component
public class WeChatPay extends Pay implements PayStrategy {
@Override
public String doPay(String type, Map<String, Object> param) {
return exec ( param );
}

@Override
protected Map<String, Object> genUrlParam(Map<String, Object> param) {
return null;
}

@Override
protected String genSign(Map<String, Object> param) {
return null;
}

@Override
protected String callPayUrl(Map<String, Object> param) {
return null;
}

@Override
protected String parseResult(String result) {
return null;
}
}

定义具体的实现类之支付宝支付:ALiPay

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
@Component
public class ALiPay extends Pay implements PayStrategy {

@Override
public String doPay(String type, Map<String, Object> param) {
return exec ( param );
}

@Override
protected Map<String, Object> genUrlParam(Map<String, Object> param) {
return null;
}

@Override
protected String genSign(Map<String, Object> param) {
return null;
}

@Override
protected String callPayUrl(Map<String, Object> param) {
return null;
}

@Override
protected String parseResult(String result) {
return null;
}
}

定义具体的实现类之银联支付:UnionPay

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@Component
public class UnionPay extends Pay implements PayStrategy {
@Override
public String doPay(String type, Map<String, Object> param) {
return exec ( param );
}

@Override
protected Map<String, Object> genUrlParam(Map<String, Object> param) {
return null;
}

@Override
protected String genSign(Map<String, Object> param) {
return null;
}

@Override
protected String callPayUrl(Map<String, Object> param) {
return null;
}

@Override
protected String parseResult(String result) {
return null;
}
}

子类的具体实现就没写了,模板方法的应用大概如此。

另外:抽象类是可以不包含抽象方法的,此时抽象类仍然不能被实例化。可以用在所有方法都是静态方法的工具类上,此时把这种工具类定义为抽象类,可以防止它被实例化。例如SpringBoot框架中的org.springframework.util包下的很多工具类就是这种用法。

-------------本文结束感谢您的阅读-------------
Good for you!