码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式六 策略模式

时间:2018-08-26 22:33:30      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:避免   mount   []   null   str   public   参考资料   inter   nal   

 

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

》算法可以自由切换

》容易扩展

 

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

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

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

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

参考资料:

咕泡学院

《大话设计模式》

《设计模式之蝉》

 

设计模式六 策略模式

标签:避免   mount   []   null   str   public   参考资料   inter   nal   

原文地址:https://www.cnblogs.com/idea-persistence/p/9539251.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!