模板方法模式(Template Method Pattern)

定義

模板方法模式定義了一個算法的步驟,並允許子類別爲一個或多個步驟提供其實踐方式。讓子類別在不改變算法架構的情況下,重新定義算法中的某些步驟。

什麼叫做模板?既然是模板,那麼就是說我使用這個模板必須要遵循模板的設計原則,以達到規範業務代碼的作用

業務場景

小A是一間公司的程序員,老闆讓他開發一個聚合支付的功能(類似微信/支付寶,一個付款碼可選擇多種支付方式),小A查看對接的金流商googlePay,Appstore,Wechat,AliPay等等,開發完成了
有一天應屆生小B作爲實習生過來你們公司,要對接一個新的支付渠道PayPal,他拷貝了你的代碼,修修改改,也完成了功能,後來小B離職了,支付出了故障,你查閱小B的代碼,發現各種命名一塌糊塗,你心裏坑定一萬隻草泥馬在崩騰。
那麼有沒有一種方法,讓所有的人都強制遵守我的編碼規範呢?答案就是模板方法設計模式

首先我們總結一下出支付通用的步驟:

  1. 創單加解密校驗
  2. 支付參數準備
  3. 請求支付
  4. 支付後狀態處理

所以我們就可以抽象出三個基本的固定步驟:支付參數準備–》請求支付—》支付回調狀態處理

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/

發佈了20 篇原創文章 · 獲贊 3 · 訪問量 5827
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章