模板方法模式&策略模式區別聯系


 

一、模板方法

模板方法模式:定義 一系列算法, 子類延伸實現。着重點在於:子類去處理不同的方法實現。 看下面例子。

假如一個支付 都包含三個部分: 生成訂單 ----》調用API發起支付-----------》處理訂單

1.基類

/** * 〈購物流程〉<br> * 〈模板方法基類〉 * * @author liangxing.zhu * @create 2018/9/15 * @since 1.0.0 */ public abstract class AbstractPay { /** * 1、生產訂單 */ public void genrateOrder() { System.out.println("正在生成業務方訂單"); } /** * 2、調用API 發起支付 */ abstract void pay(); /** * 3 回調接口,處理訂單, 給用戶加余額 */ abstract void handleOrder(); }

2 微信支付實現類

/** * 〈一句話功能簡述〉<br> * 〈微信支付〉 * * @author liangxing.zhu * @create 2018/9/15 * @since 1.0.0 */ public class Wxpay extends AbstractPay { /** * 2、調用API 發起支付 */ @Override void pay() { System.out.println("調用微信支付發起支付"); } /** * 3 回調接口,處理訂單, 給用戶加余額 */ @Override void handleOrder() { System.out.println("處理微信回調。 查詢訂單是否處理完成"); } }

3、支付寶支付

/** * 〈一句話功能簡述〉<br> * 〈支付寶支付〉 * * @author liangxing.zhu * @create 2018/9/15 * @since 1.0.0 */ public class Alipay extends AbstractPay{ /** * 2、調用API 發起支付 */ @Override void pay() { System.out.println("調用支付寶API發起支付"); } /** * 3 回調接口,處理訂單, 給用戶加余額 */ @Override void handleOrder() { System.out.println("處理支付寶回調。 查詢訂單是否處理完成"); } }

4.測試類

/** * 〈一句話功能簡述〉<br> * 〈測試 類〉 * * @author liangxing.zhu * @create 2018/9/15 * @since 1.0.0 */ public class TestPay { public static void main(String[] args) { Alipay alipay = new Alipay(); alipay.genrateOrder(); alipay.pay(); alipay.handleOrder(); Wxpay wxpay = new Wxpay(); wxpay.genrateOrder(); wxpay.pay(); wxpay.handleOrder(); } }

5 結果

正在生成業務方訂單
調用支付寶API發起支付
處理支付寶回調。 查詢訂單是否處理完成
我是分割線==============================》 正在生成業務方訂單 調用微信支付發起支付 處理微信回調。 查詢訂單是否處理完成

 

6、總結

 模板方法主要體現在子類的分別實現。

 

=======================================================================================================================================================

7 策略模式:

 策略模式 體現在策略兩個字上, 舉個例子  ,星期 1 3 5  用微信支付,  星期 246 用支付寶支付,星期天都可以用,調用者 可隨意替換支持的支付方式。

用之前的模板方法模式幾個類。

二、策略模式

1、基類

/** * 〈購物流程〉<br> * 〈模板方法基類〉 * * @author liangxing.zhu * @create 2018/9/15 * @since 1.0.0 */ public abstract class AbstractPay { /** * 1、生產訂單 */ public void genrateOrder() { System.out.println("正在生成業務方訂單"); } /** * 2、調用API 發起支付 */ abstract void pay(); /** * 3 回調接口,處理訂單, 給用戶加余額 */ abstract void handleOrder(); }

 

 

2、微信支付

/** * 〈一句話功能簡述〉<br> * 〈微信支付〉 * * @author liangxing.zhu * @create 2018/9/15 * @since 1.0.0 */ public class Wxpay extends AbstractPay { /** * 2、調用API 發起支付 */ @Override void pay() { System.out.println("調用微信支付發起支付"); } /** * 3 回調接口,處理訂單, 給用戶加余額 */ @Override void handleOrder() { System.out.println("處理微信回調。 查詢訂單是否處理完成"); } }

 

三、支付寶支付

/** * 〈一句話功能簡述〉<br> * 〈支付寶支付〉 * * @author liangxing.zhu * @create 2018/9/15 * @since 1.0.0 */ public class Alipay extends AbstractPay{ /** * 2、調用API 發起支付 */ @Override void pay() { System.out.println("調用支付寶API發起支付"); } /** * 3 回調接口,處理訂單, 給用戶加余額 */ @Override void handleOrder() { System.out.println("處理支付寶回調。 查詢訂單是否處理完成"); } }

 

4、調用者策略處理測試類(核心)

/** * 〈一句話功能簡述〉<br> * 〈測試 類〉 * * @author liangxing.zhu * @create 2018/9/15 * @since 1.0.0 */ public class TestPay { public static void main(String[] args) { AbstractPay abstractPay = null ; int day = LocalDate.now().getDayOfWeek().getValue(); if(day%2==1){ abstractPay = new Alipay(); System.out.println("策略開始。今天的時間是星期:"+day+",使用的支付方式是:aliPay"); }else if(day%2==0){ abstractPay = new Wxpay(); System.out.println("策略開始。今天的時間是星期:"+day+",使用的支付方式是:wxPay"); } abstractPay.genrateOrder(); abstractPay.pay(); abstractPay.handleOrder(); } }

5 結果

策略開始。今天的時間是星期:6,使用的支付方式是:wxPay
正在生成業務方訂單
調用微信支付發起支付
處理微信回調。 查詢訂單是否處理完成

6 總結:

策略模式 核心在 使用者的策略。 如果按照自己的策略去替換。模板方法模式 核心在 子類的 怎么實現。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM