定義
模板方法模式定義了一個算法的步驟,並允許子類別爲一個或多個步驟提供其實踐方式。讓子類別在不改變算法架構的情況下,重新定義算法中的某些步驟。
什麼叫做模板?既然是模板,那麼就是說我使用這個模板必須要遵循模板的設計原則,以達到規範業務代碼的作用
業務場景
小A是一間公司的程序員,老闆讓他開發一個聚合支付的功能(類似微信/支付寶,一個付款碼可選擇多種支付方式),小A查看對接的金流商googlePay,Appstore,Wechat,AliPay等等,開發完成了
有一天應屆生小B作爲實習生過來你們公司,要對接一個新的支付渠道PayPal,他拷貝了你的代碼,修修改改,也完成了功能,後來小B離職了,支付出了故障,你查閱小B的代碼,發現各種命名一塌糊塗,你心裏坑定一萬隻草泥馬在崩騰。
那麼有沒有一種方法,讓所有的人都強制遵守我的編碼規範呢?答案就是模板方法設計模式
首先我們總結一下出支付通用的步驟:
- 創單加解密校驗
- 支付參數準備
- 請求支付
- 支付後狀態處理
所以我們就可以抽象出三個基本的固定步驟:支付參數準備–》請求支付—》支付回調狀態處理
UML圖
代碼表現
模板方法類
/**
* 支付抽象類,定義抽象的模板方法
*/
public abstract class AbstractPay {
/**
* 模板方法,定義了支付的抽象步驟
*/
public void pay(){
checkPay();
preparePay();
callPay();
afterPay();
}
public abstract void checkPay();
public abstract void preparePay();
public abstract void callPay();
public abstract void afterPay();
}
具體支付類
/**
* 微信支付
*/
public class WeChatPay extends AbstractPay {
@Override
public void checkPay() {
System.out.println("WeChatPay checkPay");
}
@Override
public void preparePay() {
System.out.println("WeChatPay preparePay");
}
@Override
public void callPay() {
System.out.println("WeChatPay callPay");
}
@Override
public void afterPay() {
System.out.println("WeChatPay afterPay");
}
}
/**
* google支付
*/
public class GooglePay extends AbstractPay {
@Override
public void checkPay() {
System.out.println("GooglePay checkPay");
}
@Override
public void preparePay() {
System.out.println("GooglePay preparePay");
}
@Override
public void callPay() {
System.out.println("GooglePay callPay");
}
@Override
public void afterPay() {
System.out.println("GooglePay afterPay");
}
}
/**
* 支付寶支付
*/
public class AliPay extends AbstractPay {
@Override
public void checkPay() {
System.out.println("AliPay checkPay");
}
@Override
public void preparePay() {
System.out.println("AliPay preparePay");
}
@Override
public void callPay() {
System.out.println("AliPay callPay");
}
@Override
public void afterPay() {
System.out.println("AliPay afterPay");
}
}
/**
* AppStore支付
*/
public class AppStorePay extends AbstractPay {
@Override
public void checkPay() {
System.out.println("AppStorePay checkPay");
}
@Override
public void preparePay() {
System.out.println("AppStorePay preparePay");
}
@Override
public void callPay() {
System.out.println("AppStorePay callPay");
}
@Override
public void afterPay() {
System.out.println("AppStorePay afterPay");
}
}
運行main方法示例
public static void main(String[] args) {
//AliPay支付
AbstractPay pay = new AliPay();
pay.pay();
//google支付
pay = new GooglePay();
pay.pay();
//AppStorePay支付
pay = new AppStorePay();
pay.pay();
//WeChat支付
pay = new GooglePay();
pay.pay();
}
Tip: 想要查看我的更多博文,請前往我的個人github博客:https://lenjor.github.io/archive/