模板方法屬於行爲型設計模式,在父類中定義處理流程的框架,在子類中實現具體的處理java
推薦訪問個人我的網站,排版更好看呦:
https://chenmingyu.top/design-template-method/算法
在父類(抽象類)中定義好算法的流程,提供抽象方法,針對不一樣的實現交由不一樣的子類去實現,經過這種方式將公共代碼提取出來封裝在父類中,而後父類去控制行爲,子類負責實現,這樣當有不少子類的時候,若是要修改算法,只須要在父類中更改算法的行爲便可。設計模式
已支付爲例,涉及AbstractPay,BankCardPay,WeChatPay三個類。微信
抽象類(父類),定義了三個抽象方法和一個控制支付流程的方法,也就是模板方法,這個方法使用final修飾,防止被重寫框架
/** * @auther: chenmingyu * @date: 2019/2/13 16:58 * @description: 抽象類,定義支付流程 */ public abstract class AbstractPay { /** * 獲取支付信息 */ abstract String getPayInfo(); /** * 執行支付 */ abstract void executePay(); /** * 支付反饋信息 */ abstract void payMessage(); /** * 支付 */ public final void pay(){ String info = getPayInfo(); System.out.println("支付帳戶:"+info); executePay(); payMessage(); } }
子類實現,提供銀行卡支付,繼承AbstractPay類重寫三個抽象方法,提供銀行卡支付的實現ide
/** * @auther: chenmingyu * @date: 2019/2/13 17:18 * @description: 銀行卡支付 */ public class BankCardPay extends AbstractPay{ @Override String getPayInfo() { return "個人銀行卡信息"; } @Override void executePay() { System.out.println("銀行卡支付了"); } @Override void payMessage() { System.out.println("銀行卡方式支付,發短息"); } }
子類實現,提供微信支付,繼承AbstractPay類重寫三個抽象方法,提供微信支付的實現測試
/** * @auther: chenmingyu * @date: 2019/2/13 17:20 * @description: 微信支付 */ public class WeChatPay extends AbstractPay{ @Override String getPayInfo() { return "個人微信支付信息"; } @Override void executePay() { System.out.println("微信支付了"); } @Override void payMessage() { System.out.println("微信方式支付,微信內發服務通知"); } }
public static void main(String[] args) { BankCardPay bankCardPay = new BankCardPay(); bankCardPay.pay(); System.out.println("... 分割線 ..."); WeChatPay weChatPay = new WeChatPay(); weChatPay.pay(); }
輸出微信支付
支付帳戶:個人銀行卡信息 銀行卡支付了 銀行卡方式支付,發短息 ... 分割線 ... 支付帳戶:個人微信支付信息 微信支付了 微信方式支付,微信內發服務通知
總結一下,就是抽象類封裝了一個final類型的方法,方法中調用其餘的抽象方法,制定業務流程,提供的抽象方法交由子類去實現。當你有多個子類實現邏輯相同時,建議使用模板方法。網站