一、模板方法
模板方法模式:定義 一系列算法, 子類延伸實現。着重點在於:子類去處理不同的方法實現。 看下面例子。
假如一個支付 都包含三個部分: 生成訂單 ----》調用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 總結:
策略模式 核心在 使用者的策略。 如果按照自己的策略去替換。模板方法模式 核心在 子類的 怎么實現。
