zoukankan      html  css  js  c++  java
  • 模板方法模式&策略模式区别联系

    一、模板方法

    模板方法模式:定义 一系列算法, 子类延伸实现。着重点在于:子类去处理不同的方法实现。 看下面例子。

    假如一个支付 都包含三个部分: 生成订单 ----》调用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 总结:

    策略模式 核心在 使用者的策略。 如果按照自己的策略去替换。模板方法模式 核心在 子类的 怎么实现。

  • 相关阅读:
    需求征集系统第四天
    EL表达式和JSTL
    需求征集系统第三天
    [2019.1.6]BZOJ4197 [Noi2015]寿司晚宴
    [2019.1.7]BZOJ1011 [HNOI2008]遥远的行星
    [2019.1.3]BZOJ4326 NOIP2015 运输计划
    [2019.1.2]BZOJ2115 [Wc2011] Xor
    [2019.1.2]BZOJ2460 [BeiJing2011]元素
    [2019.1.1]BZOJ1806 [Ioi2007]Miners 矿工配餐
    [2019.1.1]BZOJ4195 [Noi2015]程序自动分析
  • 原文地址:https://www.cnblogs.com/zgghb/p/9650961.html
Copyright © 2011-2022 走看看