zoukankan      html  css  js  c++  java
  • 设计模式六 策略模式

    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 的代码判断

    》算法可以自由切换

    》容易扩展

    ========================================

    现在发现,更像是看了咕泡学院视频后的一些笔记,方便自己以后查找。

    单独的设计模式容易写,但现在场景中都是 混合模式的。

    ========================================

    参考资料:

    咕泡学院

    《大话设计模式》

    《设计模式之蝉》

  • 相关阅读:
    【DB宝50】Oracle异构平台迁移之完全可传输导出导入(Full Transportable Export & Import)
    【DB宝49】Oracle如何设置DB、监听和EM开机启动
    【DB宝48】JumpServer:多云环境下更好用的堡垒机
    【DB宝47】企业知识分享+团队协作神器之Confluence
    【DB宝46】NoSQL数据库之CouchBase简介、集群搭建、XDCR同步及备份恢复
    【DB宝45】MySQL高可用之MGR+Consul架构部署
    【DB宝44】Oracle rac集群中的IP类型简介
    【DB宝43】MySQL误操作闪回恢复利器之my2sql
    【DB宝42】MySQL高可用架构MHA+ProxySQL实现读写分离和负载均衡
    【DB宝41】监控利器PMM的使用--监控MySQL、PG、MongoDB、ProxySQL等
  • 原文地址:https://www.cnblogs.com/idea-persistence/p/9539251.html
Copyright © 2011-2022 走看看