场景:某些事物具有固定的流程,比如支付过程,下单,结算,支付,支付渠道,物流,其中下单,结算
支付是固定的不可更改的,但是可以选择不同的支付渠道和物流
有了策略方式给了使用者选择的权利,开发者也不用使用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));
}
}