设计模式六 策略模式

Posted idea-persistence

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式六 策略模式相关的知识,希望对你有一定的参考价值。

 

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

》算法可以自由切换

》容易扩展

 

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

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

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

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

参考资料:

咕泡学院

《大话设计模式》

《设计模式之蝉》

 

以上是关于设计模式六 策略模式的主要内容,如果未能解决你的问题,请参考以下文章

Java常见设计模式学习(非原创)

Redis实现分布式锁(设计模式应用实战)

Redis实现分布式锁(设计模式应用实战)

设计模式策略模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

代码片-策略模式+工厂模式

代码片-策略模式+工厂模式