一、模板方法

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

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

    定义主键和外键主要是为了维护关系数据库的完整性,总结一下: 1.主键是能确定一条记录的唯一标识,比如,一条记录包括身份正号,姓名,年龄. 身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证 ...

  2. 经典换根dp——hdu2196

    给定一棵边权树,求距离每个点最远的点,输出这个距离 #include<bits/stdc++.h> using namespace std; #define N 10005 ]; int ...

  3. NX二次开发-UFUN获取面的内外边界UF_MODL_ask_loop_list_item

    NX11+VS2013 #include <uf.h> #include <uf_modl.h> #include <NXOpen/Face.hxx> #inclu ...

  4. 笨办法学Python记录--习题1-11

    20140412(习题1-10),和打印较劲: 1. 读这本书时没有按照要求安装Python2,我选择的是最新版3.4.0(官方release),然后悲剧发现完全不兼容,现在摘录2,3区别: 这个星期 ...

  5. QTableWidget学习

    一.这次项目需要用到,可以在tablewidget中添加item,并且可以通过鼠标的右键选项进行一些打开.删除等操作. 1.在构造函数中定制右键菜单选项 ui.tableWidget_2->se ...

  6. Spark Streaming的简单介绍

    本文讲解Spark流数据处理之Spark Streaming.本文的写作时值Spark 1.6.2发布之际,Spark 2.0预览版也已发布,Spark发展如此迅速,请随时关注Spark Stream ...

  7. item字母问题

    解决方法:复写toString方法 @Override public String toString() { return this.getBookTypeName(); } 将对象的toString ...

  8. QT之发布

    https://blog.csdn.net/qq_40194498/article/details/79926054打开windows控制台直接输入 windeployqt --help 可以知道想要 ...

  9. 前端常用的库和实用技术之JavaScript面向切面编程

    Aspect Oriented Programming(AOP)面向切面编程是一个比较热门的话题. AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程 中的某个步骤或阶段,以 ...

  10. c_数据结构_二叉树的遍历实现

    #include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 #define OVERFLOW -2 #d ...