模板方法模式&策略模式区别联系


 

一、模板方法

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

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