一、模板方法

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

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

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

模板方法模式&策略模式区别联系的更多相关文章

  1. 命令模式 & 策略模式 & 模板方法

    一.策略模式 策略模式:封装易变化的算法,可互相替换. GoF<设计模式>中说道:定义一系列算法,把它们一个个封装起来,并且使它们可以相互替换.该模式使得算法可独立于它们的客户变化. 比如 ...

  2. 简单工厂模式&策略模式-简介与区别

    不得不说,这两种模式真的很像. 相似点:都用到了面向对象的继承.多态.抽象,都拥有相似的结构. 不同点:工厂模式仅提供具体的实例对象,怎么使用这个对象是client的自由,策略模式client可以通过 ...

  3. 3.js模式-策略模式

    1. 策略模式 策略模式定义一系列的算法,把它们封装起来,并且可以互相替换. var strategies = { isNonEmpty: function(value,errMsg){ if(val ...

  4. 工厂模式&策略模式。

    抽象.封装,具体事情做得越多,越容易犯错误.这每个做过具体工作的人都深有体会,相反,官做得越高,说出的话越抽象越笼统,犯错误可能性就越少.好象我们从编程序中也能悟出人生道理.(百度百科) 不断抽象封装 ...

  5. [19/05/01-星期三] GOF23_行为型模式(策略模式、模板方法模式)

    一.策略模式(strategy) [策略接口] /*** * "策略"接口 */ package cn.sxt.strategy; public interface Strateg ...

  6. [Python模式]策略模式

    策略模式 定义了算法族,分别封装起来,让它们之间可以互相替换.此模式让算法的变化独立于使用算法的客户. 作为动态语言,Python实现策略模式非常容易,只要所有算法提供相同的函数即可. import ...

  7. java设计模式--行为型模式--策略模式

    策略模式: 策略模式 概述 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化. 适用性 1.许多相关的类仅仅是行为有异.“策略”提供了一种用多个行 ...

  8. <大话设计模式>工厂模式,策略模式

    第一章:工厂模式: 通过封装,继承,多态解耦合 业务逻辑和界面逻辑分开 用单独的类创造实例,工厂:创造实例 工厂模式还可以用反射来实现,nsstringFromClass UML类图 聚合表示一众弱的 ...

  9. 设计模式之——浅谈strategy模式(策略模式)

    strategy模式,即策略模式.个人觉得吧,策略模式更多的是一种思维方式. 首先我们要知道,为什么需要策略模式.举个例子,比如用程序输出今天下午去玩什么. PlayGame 玩游戏 package ...

随机推荐

  1. fastJson中常用方法以及遇到的“坑”

    1.使用fastJson,首先引入fastJson依赖 <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --> & ...

  2. lua之table|模块|包

    一.table table是   Lua的一种数据结构用来帮助我们创建不同的数据类型,如:数字.字典等. Lua table使用关联型数组,你可以用任意类型的值来作数组的索引,但这个值不能是   ni ...

  3. HDU5669

    目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog Problem:传送门  Portal  原题目描述在最下面.  给你n个点 ...

  4. NPAPI插件开发新手容易遇到的问题

    在网上找了一个npdemo的例子,编译了一下在FireFox运行正常,在Chrome下就是不行,也没任何提示. 折腾了好久,最后发现是rc文件 支持语言编码问题 NPAPI插件开发详细记录:用VS20 ...

  5. 在桌面上显示IE图标(非快捷键)

    1.在桌面点击右键选择"属性"打开"显示属性",选择"桌面">"自定义桌面">"常规"& ...

  6. 2.用Python套用Excel模板,一键完成原亮样式

    from xlutils.copy import copy import xlrd import xlwt tem_excel=xlrd.open_workbook('日统计.xls',formatt ...

  7. unittest(1)

    一.unittest核心概念 1.unittest四个核心概念 unittest四个核心概念包括:TestCase.TestSuite.TestRunner.Test Fixture TestCase ...

  8. Git的故事

    目录 Git Git的概念 Git的安装 Git的配置 Git的指令 Git Git的概念 首先我们要知道git是什么,最根本的概念是版本控制,顾名思义,就是git可以帮助我们控制自己写的代码或者文档 ...

  9. 【CF516D】Drazil and Morning Exercise

    题目 首先我们知道,在树上距离一个点最远的点一定是直径的两个端点之一 首先两遍\(\rm dfs\)把直径求出来,定义\(d(u)\)表示点\(u\)距离其最远点的距离,有了直径我们就能求出\(d\) ...

  10. linux下创建oracle表空间

    来自:http://blog.sina.com.cn/s/blog_62192aed01018aep.html 1 . 登录服务器 2 . 查看磁盘空间是否够大df -h -h更具目前磁盘空间和使用情 ...