定义了算法家族,分别封装起来,让他们之间能够互相替换,此模式让算法对变化,不会影响到使用算法到客户。java
通俗的讲,场景有以下一些:旅行的路线、登入方式、爬虫的目标网站、支付渠道。。。算法
spring 中 BeanFacotry 中有使用。spring
本文场景选用 支付渠道设计模式
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.javaide
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 图ui
用户只需 从定义的算法中进行 选择this
2.1 优势
》避免了 不少的 switch 和 if else 的代码判断
》算法能够自由切换
》容易扩展
========================================
如今发现,更像是看了咕泡学院视频后的一些笔记,方便本身之后查找。
单独的设计模式容易写,但如今场景中都是 混合模式的。
========================================
参考资料:
咕泡学院
《大话设计模式》
《设计模式之蝉》