美文网首页
策略模式实战

策略模式实战

作者: 奋斗的韭菜汪 | 来源:发表于2020-06-23 21:25 被阅读0次

策略模式:例子:比较器,旅行路线,固定算法,网购结算支付
应用场景:根据用户的需求处理数据时需要对算法做出一个选择,选择是固定的一些算法(不变的算法),算法可以扩展,
通常会和抽象工厂模式结合使用
//spring源码中有很多创建bean的factory,例如beanFactory, ListableFactory,用户可以通过配置文件制定使用哪种Factory创建Bean

/**
 * 支付渠道
 */
public interface Payment {
    //每次增加一个支付渠道,就要维护接口违背开闭
//    public final  static  Payment ALI_PAY = new AliPay();
//    public final  static  Payment WX_PAY = new WxPay();
//    public final  static  Payment JD_Pay = new JDPay();
      PayState pay(String uid, double amount);
}
public class WxPay implements Payment {
    @Override
    public PayState pay(String uid, double amount) {
        //固定算法
        System.out.println("欢迎使用微信支付");
        System.out.println("查询余额,微信红包扣款");

        return new PayState(200, "支付成功", "支付金额:" + amount);
    }
}
public class AliPay implements Payment {
    @Override
    public PayState pay(String uid, double amount) {
        //固定算法
        System.out.println("欢迎使用支付宝");
        System.out.println("查询余额,扣款");
        return new PayState(200, "支付成功", "支付金额:" + amount);
    }
}
public class JDPay implements Payment {
    @Override
    public PayState pay(String uid, double amount) {
        //固定算法
        System.out.println("欢迎使用京东白条");
        System.out.println("查询余额,白条扣款");
        return new PayState(200, "支付成功", "支付金额:" + amount);
    }
}
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;
    }

    //这个参数完全可以用Payment这个接口代替,为什么不用?
    //因为可以省去写switch或者if else
    //也就是说若是用接口,接口里必须先写好if else来选择支付方式
    public PayState pay(PayType payType){
        return payType.get().pay(this.uid, this.amount);
    }
}
/**
 * 姑且把枚举当做常连池来维护
 */
public enum PayType {
    ALI_PAY(new AliPay()),
    WX_PAY(new WxPay()),
    JD_PAY(new JDPay());

    private Payment payment;
    PayType(Payment payment) {
        this.payment = payment;
    }
    public Payment get() {
        return this.payment;
    }
}
/**
 * 支付完成后的状态
 */
public class PayState {

    private int code;
    private Object data;
    private String msg;

    public PayState(int code, Object data, String msg) {
        this.code = code;
        this.data = data;
        this.msg = msg;
    }

    @Override
    public String toString() {
        return "PayState{" +
                "code=" + code +
                ", data=" + data +
                ", msg='" + msg + '\'' +
                '}';
    }
}

public class PayStrategyTest {
    public static void main(String[] args) {
        Order order = new Order("1", "1231231", 90.0D);
        //开始支付:微信支付,支付宝支付,财付通支付
        //每个渠道支付的具体算法是不一样的
        //每个支付的算法是固定
        System.out.println(order.pay(PayType.JD_PAY));
    }
}

运行结果

欢迎使用京东白条
查询余额,白条扣款
PayState{code=200, data=支付成功, msg='支付金额:90.0'}

Process finished with exit code 0

相关文章

  • 策略模式实战

    策略模式:例子:比较器,旅行路线,固定算法,网购结算支付应用场景:根据用户的需求处理数据时需要对算法做出一个选择,...

  • 设计模式之策略模式

    设计模式(策略模式实战) 一.分类 java的设计模式大体上分为三大类: 创建型模式(5种): 工厂方法模式,抽象...

  • 61 - 策略模式实战

    设计原则和思想其实比设计模式更加普适和重要,掌握了代码的设计原则和思想,甚至可以自己创造出来新的设计模式 问题与解...

  • 爱的语言修炼第四十八天

    20171108 提升夫妻亲密关系实战策略:女人要示弱现在不少家庭是“老婆强势老公弱势”的模式,这样的家庭模式不太...

  • 11.7设计模式-策略模式-详解

    设计模式-策略模式 策略模式详解 策略模式在android中的实际运用 1.策略模式详解 2.策略模式在andro...

  • 2021-11-25

    《投资策略实战检验》 书中讲到了通过巴菲特的投资行为与商业模式,分析了行业选择对于投资策略的重要性。 行业选择对于...

  • 设计模式之策略模式代码实战

    课程目标 了解代码重构 了解策略模式的定义、应用场景 了解JDK中策略模式的应用 了解设计原则(开闭原则、单一职责...

  • 设计模式实战-策略模式(Strategy Pattern)

    0 联系我 0.0 相关源码链接 https://github.com/Wasabi1234/design-pat...

  • 深入浅出设计模式(一)-策略模式

    本文解决问题 什么是策略模式? 策略模式的优缺点以及策略模式解决了什么痛点 策略模式的适用环境 什么是策略模式? ...

  • 策略、工厂模式融合 InitializingBean

    策略、工厂模式融合 InitializingBean 策略、工厂模式分别是什么 策略模式 策略模式是将不同的算法封...

网友评论

      本文标题:策略模式实战

      本文链接:https://www.haomeiwen.com/subject/jyjkfktx.html