1. 程式人生 > >模板方法模式&策略模式區別聯系

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

支持 余額 rri get system 流程 lda public ()

一、模板方法

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

假如一個支付 都包含三個部分: 生成訂單 ----》調用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 總結:

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

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