策略模式

场景:某些事物具有固定的流程,比如支付过程,下单,结算,支付,支付渠道,物流,其中下单,结算

支付是固定的不可更改的,但是可以选择不同的支付渠道和物流

有了策略方式给了使用者选择的权利,开发者也不用使用if或者switch去判断用户的选择

特点:执行过程和逻辑不同,可供用户选择,但是执行结果固定

 

订单

//订单对象
package com.gupaoedu.vip.pattern.strategy.pay;

import com.gupaoedu.vip.pattern.strategy.pay.payport.PayType;
import com.gupaoedu.vip.pattern.strategy.pay.payport.Payment;

/**
 * Created by Tom on 2018/3/11.
 */
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(this.uid,this.amount)
    }

}

支付渠道

package com.gupaoedu.vip.pattern.strategy.pay.payport;

import com.gupaoedu.vip.pattern.strategy.pay.PayState;

/**
 * 支付渠道
 * Created by Tom on 2018/3/11.
 */
public interface Payment {

    public PayState pay(String uid, double amount);

}




//阿里支付,实现支付渠道接口

package com.gupaoedu.vip.pattern.strategy.pay.payport;

import com.gupaoedu.vip.pattern.strategy.pay.PayState;

/**
 * Created by Tom on 2018/3/11.
 */
public class AliPay implements Payment {

    @Override
    public PayState pay(String uid, double amount) {
        System.out.println("欢迎使用支付宝");
        System.out.println("查询账户余额,开始扣款");
        return new PayState(200,"支付成功",amount);
    }
}




//京东支付,实现支付渠道接口
package com.gupaoedu.vip.pattern.strategy.pay.payport;

import com.gupaoedu.vip.pattern.strategy.pay.PayState;

/**
 * Created by Tom on 2018/3/11.
 */
public class JDPay implements Payment {

    @Override
    public PayState pay(String uid, double amount) {
        System.out.println("欢迎使用京东白条");
        System.out.println("查询账户余额,开始扣款");
        return new PayState(200,"支付成功",amount);
    }
}

支付状态

package com.gupaoedu.vip.pattern.strategy.pay;

/**
 * 支付完成以后的状态
 * Created by Tom on 2018/3/11.
 */
public class PayState {
    private int code;
    private Object data;
    private String msg;

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

    public String toString(){
        return ("支付状态:[" + code + "]," + msg + ",交易详情:" + data);
    }
}

测试

package com.gupaoedu.vip.pattern.strategy.pay;

import com.gupaoedu.vip.pattern.strategy.pay.Order;
import com.gupaoedu.vip.pattern.strategy.pay.payport.PayType;
import com.gupaoedu.vip.pattern.strategy.pay.payport.Payment;

import java.util.ArrayList;
import java.util.Comparator;

/**
 * Created by Tom on 2018/3/11.
 */
public class PayStrategyTest {

    public static void main(String[] args) {

        //省略把商品添加到购物车,再从购物车下单
        //直接从点单开始
        Order order = new Order("1","20180311001000009",324.45);

        //开始支付,选择微信支付、支付宝、银联卡、京东白条、财付通
        //每个渠道它支付的具体算法是不一样的
        //基本算法固定的

        //这个值是在支付的时候才决定用哪个值
        System.out.println(order.pay(new(AliPay)));




    }

}

做一个微小的修改提高 代码的质量

每增加一个支付渠道需要在枚举里面增加一个常量

package com.gupaoedu.vip.pattern.strategy.pay.payport;

/**
 * 姑且把这个枚举当做一个常量去维护
 * Created by Tom on 2018/3/11.
 */
public enum PayType {
    ALI_PAY(new AliPay()),
    JD_PAY(new JDPay());

    private Payment payment;
    PayType(Payment payment){
        this.payment = payment;
    }

    public Payment get(){ return  this.payment;}
}


//修改支付方法
package com.gupaoedu.vip.pattern.strategy.pay;

import com.gupaoedu.vip.pattern.strategy.pay.payport.PayType;
import com.gupaoedu.vip.pattern.strategy.pay.payport.Payment;

/**
 * Created by Tom on 2018/3/11.
 */
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(PayType payType){
        return payType.get().pay(this.uid,this.amount);
    }

}


//修改测试方法
package com.gupaoedu.vip.pattern.strategy.pay;

import com.gupaoedu.vip.pattern.strategy.pay.Order;
import com.gupaoedu.vip.pattern.strategy.pay.payport.PayType;
import com.gupaoedu.vip.pattern.strategy.pay.payport.Payment;

import java.util.ArrayList;
import java.util.Comparator;

/**
 * Created by Tom on 2018/3/11.
 */
public class PayStrategyTest {

    public static void main(String[] args) {

        //省略把商品添加到购物车,再从购物车下单
        //直接从点单开始
        Order order = new Order("1","20180311001000009",324.45);

        //开始支付,选择微信支付、支付宝、银联卡、京东白条、财付通
        //每个渠道它支付的具体算法是不一样的
        //基本算法固定的

        //这个值是在支付的时候才决定用哪个值
        System.out.println(order.pay(PayType.WECHAT_PAY));


    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值