改动
- 以下是之前的PayService接口,之前为了举例,只是简单写了两个方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
public interface PayService {
PayEnum getPayType();
void pay(Object obj); }
|
- 本次演示模板方法模式,再添加如下的业务方法,sign() 为签名方法,微信支付和支付宝支付都需要先进行签名再请求接口,每个实现类签名方法略有不同,所以交由具体实现类实现,createOrder() 为创建订单方法,doPay() 为支付主方法,业务处主要调用的方法。
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
|
public interface PayService {
PayEnum getPayType();
String sign(Object obj);
void createOrder(Object obj);
void pay(Object obj);
void doPay(Object obj); }
|
- 增加抽象实现类AbstractPayServiceImpl,该类位于PayService接口与AliPayServiceImpl等具体实现类中间,为 createOrder() 等逻辑相同的方法提供默认实现,并在 doPay() 主方法中将各个方法调用逻辑组织起来。
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
| @Service public abstract class AbstractPayServiceImpl implements PayService {
@Override public void createOrder(Object obj) { System.out.println(String.format("创建%s类型的订单", getPayType().getEn())); }
@Override public void doPay(Object obj) {
sign(obj);
createOrder(obj);
pay(obj); } }
|
- 修改具体实现类继承抽象类,并重写抽象方法,由于createOrder() 在抽象类中已提供默认实现,所以具体子类中不需要重写,如果默认实现满足不了某个子类,则子类可以进行重写。
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 29 30 31
|
@Service public class AliPayServiceImpl extends AbstractPayServiceImpl {
@Override public PayEnum getPayType() { return PayEnum.ALIPAY; }
@Override public String sign(Object obj) { return "testAliPaySign"; }
@Override public void pay(Object obj) { System.out.println("使用了支付宝支付"); } }
|
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 29 30 31
|
@Service public class WxPayServiceImpl extends AbstractPayServiceImpl {
@Override public PayEnum getPayType() { return PayEnum.WX; }
@Override public String sign(Object obj) { return "testWxSign"; }
@Override public void pay(Object obj) { System.out.println("使用了微信支付"); } }
|
使用演示
1 2 3 4 5 6
| @Test public void testPay() { PayServiceFactory.get(PayEnum.WX).doPay(new Object()); PayServiceFactory.get(PayEnum.ALIPAY).doPay(new Object()); }
|
执行结果
总结
引入模板方法模式将支付主逻辑在doPay() 主方法中进行实现,其中各个子方法的实现可能有相同也可能有不同,根据需求在AbstractPayServiceImpl中来选择是否重写,如果未重写则子类必须重写;已重写的方法,子类可以根据默认方法是否满足自身需求来选择是否需要重写,从而使得代码耦合度降低,并且可读性也有所提升,每个类的职责单一,不至于太过复杂。