一、模板方法
模板方法模式:定义 一系列算法, 子类延伸实现。着重点在于:子类去处理不同的方法实现。 看下面例子。
假如一个支付 都包含三个部分: 生成订单 ----》调用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 总结:
策略模式 核心在 使用者的策略。 如果按照自己的策略去替换。模板方法模式 核心在 子类的 怎么实现。