模板方法模式&策略模式区别联系
一、模板方法
模板方法模式:定义 一系列算法, 子类延伸实现。着重点在于:子类去处理不同的方法实现。 看下面例子。
假如一个支付 都包含三个部分: 生成订单 ----》调用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 总结:
策略模式 核心在 使用者的策略。 如果按照自己的策略去替换。模板方法模式 核心在 子类的 怎么实现。
模板方法模式&策略模式区别联系的更多相关文章
- 命令模式 & 策略模式 & 模板方法
一.策略模式 策略模式:封装易变化的算法,可互相替换. GoF<设计模式>中说道:定义一系列算法,把它们一个个封装起来,并且使它们可以相互替换.该模式使得算法可独立于它们的客户变化. 比如 ...
- 简单工厂模式&策略模式-简介与区别
不得不说,这两种模式真的很像. 相似点:都用到了面向对象的继承.多态.抽象,都拥有相似的结构. 不同点:工厂模式仅提供具体的实例对象,怎么使用这个对象是client的自由,策略模式client可以通过 ...
- 3.js模式-策略模式
1. 策略模式 策略模式定义一系列的算法,把它们封装起来,并且可以互相替换. var strategies = { isNonEmpty: function(value,errMsg){ if(val ...
- 工厂模式&策略模式。
抽象.封装,具体事情做得越多,越容易犯错误.这每个做过具体工作的人都深有体会,相反,官做得越高,说出的话越抽象越笼统,犯错误可能性就越少.好象我们从编程序中也能悟出人生道理.(百度百科) 不断抽象封装 ...
- [19/05/01-星期三] GOF23_行为型模式(策略模式、模板方法模式)
一.策略模式(strategy) [策略接口] /*** * "策略"接口 */ package cn.sxt.strategy; public interface Strateg ...
- [Python模式]策略模式
策略模式 定义了算法族,分别封装起来,让它们之间可以互相替换.此模式让算法的变化独立于使用算法的客户. 作为动态语言,Python实现策略模式非常容易,只要所有算法提供相同的函数即可. import ...
- java设计模式--行为型模式--策略模式
策略模式: 策略模式 概述 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化. 适用性 1.许多相关的类仅仅是行为有异.“策略”提供了一种用多个行 ...
- <大话设计模式>工厂模式,策略模式
第一章:工厂模式: 通过封装,继承,多态解耦合 业务逻辑和界面逻辑分开 用单独的类创造实例,工厂:创造实例 工厂模式还可以用反射来实现,nsstringFromClass UML类图 聚合表示一众弱的 ...
- 设计模式之——浅谈strategy模式(策略模式)
strategy模式,即策略模式.个人觉得吧,策略模式更多的是一种思维方式. 首先我们要知道,为什么需要策略模式.举个例子,比如用程序输出今天下午去玩什么. PlayGame 玩游戏 package ...
随机推荐
- js怎样判断一个数是质数
1.首先了解什么是质数(即:只能被1和它本身整除的数叫质数)主要代码 /** *判断该数是否为素数 */ function isPrimeNum(num){ ; i < num/+; i++) ...
- C#中反射的基础基础基础
class Program { static void Main(string[] args) { Type t = typeof(Student);//typeof(类) 取类的类型 并且存储在Ty ...
- 在线暴躁:<script />问题
这个问题是今天发现的,以前都没注意到这个问题: <script src="./vue/vue.min.js" /> <script src="./vue ...
- Ruby 类和对象
Ruby 类和对象 Ruby 是一种完美的面向对象编程语言.面向对象编程语言的特性包括: 数据封装 数据抽象 多态性 继承 这些特性将在 面向对象的 Ruby 中进行讨论. 一个面向对象的程序,涉及到 ...
- 【Nginx】Nginx配置
序言 Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的.从2004年发布至今,凭借开源的力量,已经接近成熟与完善. Nginx功能丰富,可作为HTTP服务器,也 ...
- NX二次开发-UFUN判断文件是否存在UF_CFI_ask_file_exist
#include <uf.h> #include <uf_ui.h> #include <uf_cfi.h> UF_initialize(); //判断文件是否存在 ...
- getmapping等无法解析
版本要改一下,4.1.6没有<dependency> <groupId>org.springframework</groupId> <artifactId&g ...
- Git仓库操作命令
创建仓库 git init 在当前目录执行,会生成.git目录文件,这个和SVN一致. 提交到仓库 git commit -m "first commit" -m:表示提交描述,必 ...
- DOM基础及事件基础
DOM:功能:控制html文档的内容代码:获取页面标签(元素)对象 Element document.getElementById("id值"):通过元素id获取元素对象操作Ele ...
- Django 前后端数据传输、ajax、分页器
返回ORM目录 Django ORM 内容目录: 一.MTV与MVC模式 二.多对多表三种创建方式 三.前后端传输数据 四.Ajax 五.批量插入数据 六.自定义分页器 一.MTV与MVC模式 M ...