转自:https://www.jianshu.com/p/3ea48ecd7178
1.策略模式简介
先了解一下策略模式的定义
策略模式: 定义一系列的算法, 把它们一个个封装起来, 并且使它们可相互替换。 本模式使得算法可独立于使用它的客户而变化
应用场景: 旅游出行方式,固定算法,支付方式
spring中的体现:Spring 中在实例化对象的时候用到 Strategy 模式, 在SimpleInstantiationStrategy 有使用
再来了解一下策略模式的uml图,看图中类和接口之间的层次关系
可以发现,每个具体策略的实现都实现了相同的接口或者父类,然后需要提供一个上下文来提供策略的引用
2.策略模式实例
问题 :关于支付方式选择的问题
现在有一名客户需要在微信支付和银联支付以及支付宝这三种支付方式中选择一种支付方式来给订单付款,当选择一种支付方式支付成功之后,会得到支付的具体信息是否支付成功,以及支付的金额是多少
分析问题:
可以把微信支付、银联支付以及支付宝支付共同实现一个共同的支付的接口,该支付的返回结果为支付后状态,还需要模拟一个订单类,让客户为这个订单类付款。至于这三种支付方式的如何选择,可以让客户自己来选择,可以通过一个枚举类型来让客户选择。
具体的代码实现:
先给出支付状态的代码实现
/**
* @Project: spring
* @description: 支付后的状态
* @author: sunkang
* @create: 2018-09-03 11:16
* @ModificationHistory who when What
**/
public class PayState {
//支付后的状态码
private int code;
//支付后的消息提示
private String msg;
//代表谁支付的
private String uid ;
//支付的数据大小
private Object data;
public PayState(int code, String msg, String uid, Object data) {
this.code = code;
this.msg = msg;
this.uid = uid;
this.data = data;
}
@Override
public String toString() {
return "payState{" +
"code=" + code +
", msg='" + msg + '\'' +
", uid='" + uid + '\'' +
", data=" + data +
'}';
}
}
支付方式的接口
/**
* @Project: spring
* @description: 支付方式的接口
* @author: sunkang
* @create: 2018-09-03 11:14
* @ModificationHistory who when What
**/
public interface Payment {
/**
*
* @param uid 表示人的uid
* @param amount 表示支付的金额
* @return
*/
PayState pay(String uid, double amount);
}
支付宝支付的实现
/**
* @Project: spring
* @description: 支付宝支付
* @author: sunkang
* @create: 2018-09-03 11:22
* @ModificationHistory who when What
**/
public class AliPay implements Payment{
@Override
public PayState pay(String uid, double amount) {
System.out.println("欢迎来到支付宝支付");
System.out.println("开始查询余额,开始扣款");
return new PayState(200,"支付成功",uid,amount);
}
}
银联闪付的实现
/**
* @Project: spring
* @description: 银联闪付的实现
* @author: sunkang
* @create: 2018-09-03 11:26
* @ModificationHistory who when What
**/
public class UnionPay implements Payment {
@Override
public PayState pay(String uid, double amount) {
System.out.println("欢迎来到银联闪付");
System.out.println("开始查询余额,开始扣款");
return new PayState(200,"支付成功",uid,amount);
}
}
微信支付的实现
/**
* @Project: spring
* @description: 微信支付的实现
* @author: sunkang
* @create: 2018-09-03 11:24
* @ModificationHistory who when What
**/
public class WechatPay implements Payment {
@Override
public PayState pay(String uid, double amount) {
System.out.println("欢迎来到微信支付");
System.out.println("开始查询余额,开始扣款");
return new PayState(200,"支付成功",uid,amount);
}
}
提供一个支付方式的选择器
/**
* @Project: spring
* @description: 支付方式的一个context
* @author: sunkang
* @create: 2018-09-03 11:29
* @ModificationHistory who when What
**/
public enum PayType {
ALI_PAY(new AliPay()),
WECHAT_PAY(new AliPay()),
UNION_PAY(new AliPay());
private Payment payment ;
PayType(Payment payment) {
this.payment = payment;
}
public Payment get(){
return this.payment;
}
}
模拟一个订单类
/**
* @Project: spring
* @description: 模拟一个订单类
* @author: sunkang
* @create: 2018-09-03 11:27
* @ModificationHistory who when What
**/
public class Order {
private String uid;
private String oid;
private double amount;
public Order(String uid, String oid, double amount) {
this.uid = uid;
this.oid = oid;
this.amount = amount;
}
//为订单支付
public PayState pay(PayType payType){
return payType.get().pay(uid,amount);
}
}
策略模式测试
/**
* @Project: spring
* @description: 策略模式测试
* @author: sunkang
* @create: 2018-09-03 11:33
* @ModificationHistory who when What
**/
public class StrategyTest {
public static void main(String[] args) {
Order order = new Order("1","order101",43.23);
//比如选择阿里支付
PayState payState = order.pay(PayType.ALI_PAY);
System.out.println(payState);
}
}
测试结果