策略模式是指定义了算法家族并将其封装起来,让它们之间可以相互替换,而不影响使用此算法的用户。
策略模式的应用场景如下
-
系统中有很多类,这些类之间区别仅仅在于行为不同。
-
一个系统需要动态的在几种算法中选择其中的一种来执行。
举个例子,基本所有的人都有在网上买过东西(比如 服装、书、车票等),在我们选中某个或者某些商品之后,选择付款时会让我们选择付款方式,如:支付宝、银联、微信等,也可能支持第三方的支付。那就以买书写一个小小的例子来简单了解下策略模式:
1、创建支付状态包装类,即返回到前台的信息封装。
public class PayState {
private int code;
private Object data;
private String msg;
public PayState(int code, Object data, String msg) {
this.code = code;
this.data = data;
this.msg = msg;
}
public String toString(){
return "支付状态:["+ code +"]," + msg + ",交易详情:" + data ;
}
}
2、创建支付抽象类 Payment
public abstract class patment {
// 支付类型
public String getName();
// 查询余额
protected abstract double queryBalance(String uid);
// 支付扣款
public Paystate pay(String uid, double amount){
if(queryBalance(uid)<amount){
return new Paystate(500,"支付失败","余额不足");
}
return new Paystate(200,"支付成功","支付余额:" + amount );
}
}
3、以下分别创建各种支付方式:
支付宝支付类
public class AliPay extends Payment {
public String getName(){
return "支付宝";
}
public double queryBalance(String uid){
return 900;
}
}
微信支付类
public class WechatPay extends Payment {
public String getName(){
return "微信";
}
public double queryBalance(String uid){
return 365;
}
}
银联支付类
public class UnionPay extends Payment {
public String getName(){
return "银联";
}
public double queryBalance(String uid){
return 120;
}
}
4、创建支付策略管理类
public class PayStrategy{
public static final String ALI_PAY = "AliPay";
public static final String WECHAT_PAY = "WechatPay";
public static final String UNION_PAY = "UnionPay";
public static final String DEFAULT_PAY = ALI_PAY;
private static Map<String, Payment> payStrategy = new HashMap<String,Payment>();
static{
payStrategy.put(ALI_PAY,new AliPay());
payStrategy.put(WECHAT_PAY,new WechatPay());
payStrategy.put(UNION_PAY,new UnionPay());
}
public static Payment get(String payKey){
if(!payStrategy.containsKey(payKey)){
return payStrategy.get(DEFAULT_PAY);
}
return payStrategy.get(payKey);
}
}
5、创建订单 order 类
public class Order{
private String uid;
private Stirng orderId;
private double amount;
public Order(String uid, String orderId orderId, double amount){
this.uid = uid;
this.orderId = orderId;
this.amount = amount;
}
// 解决了代码中的 switch 或者 if else
public Payment pay(){
return pay(PayStrategy.DEFAULT_PAY);
}
public Payment pay(String payKey){
Payment payment = PayStrategy.get(payKey);
System.out.println("欢迎使用:"payment.getName());
System.out.println("本次交易金额为:" + amount + ",开始扣款……");
return payment.pay(uid,amount);
}
}
6、测试代码如下:
public static void main(String[] args){
// 为节约代码量 专注于策略模式,此处省略把商品添加到购物车,再从购物车下单。直接从订单开始
Order order = new Order("1","201908181922401524",324.5);
// 开始支付,可以选择支付宝、微信、银联中的任意一种
// 后期如若添加京东、华为等新的支付渠道,只需创建一个新的支付类,及常量即可。
System.out.println(order.pay(PayStrategy.ALI_PAY));
}
控制台输出如下:
欢迎使用支付宝
本次交易金额为:324.5,开始扣款……
支付状态:[200],支付成功,交易详情:支付金额:324.5
策略模式简介到你结束,此篇博文只作为简单的了解。