设计模式六 策略模式
0、 基本定义
定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法对变化,不会影响到使用算法到客户。
通俗的讲,场景有如下一些:旅行的路线、登入方式、爬虫的目标网站、支付渠道。。。
spring 中 BeanFacotry 中有使用。
本文场景选用 支付渠道
1、代码
Order.java
public class Order { private String uid; private String orderId; private double amount; public Order(String uid, String orderId, double amount) { this.uid = uid; this.orderId = orderId; this.amount = amount; } // public PayState pay(Payment payment) { // // return payment.pay(uid, amount); // } //完全可以用Payment接口代替, but why? //解决了 switch 的过程,和if else public PayState pay(PayType payType) { return payType.get().pay(uid, amount); } }
Payment.java
public interface Payment { //TODO 每次新增支付渠道,就需要维护, enum public final static Payment ALI_PAY = new AliPay(); public final static Payment WECHAT_PAY = new WechatPay(); public final static Payment JD_PAY = new JDPay(); PayState pay(String uid, double amount); } public class AliPay implements Payment { @Override public PayState pay(String uid, double amount) { System.out.println("AliPay 支付"); System.out.println("开始扣款"); return new PayState(200, "支付成功", null); } } public class JDPay implements Payment { @Override public PayState pay(String uid, double amount) { System.out.println("AliPay 支付"); System.out.println("开始扣款"); return new PayState(200, "支付成功", null); } } public class WechatPay implements Payment { @Override public PayState pay(String uid, double amount) { System.out.println("JD baitiao 支付"); System.out.println("开始扣款"); return new PayState(200, "支付成功", null); } }
PayType.java 对用户操作对优化
public enum PayType { ALI_PAY(new AliPay()), WECHAT_PAY(new WechatPay()), JD_PAY(new JDPay()); private Payment payment; PayType(Payment payment) { this.payment = payment; } public Payment get() { return this.payment; } }
Test
public class PayStrategyTest { public static void main(String[] args) { //订单 Order order = new Order("1", "201808200000001", 100); //支付选择.微信,支付宝,京东白条 //每个支付渠道有特定的算法。 //基本算法固定 //用户决定 支付渠道 // PayState pay = order.pay(new AliPay()); PayState pay = order.pay(PayType.JD_PAY); System.out.println(pay); } }
uml 图
2、总结
用户只需 从定义的算法中进行 选择
2.1 优点
》避免了 很多的 switch 和 if else 的代码判断
》算法可以自由切换
》容易扩展
========================================
现在发现,更像是看了咕泡学院视频后的一些笔记,方便自己以后查找。
单独的设计模式容易写,但现在场景中都是 混合模式的。
========================================
参考资料:
咕泡学院
《大话设计模式》
《设计模式之蝉》