策略模式
应用场景:定义一系列支付方式,把它们一个个封装起来,并且使它们可相互替换,本模式使得支付方式可独立于使用它的客户端而变化
特点:最终执行的结果是固定的,执行过程和执行逻辑不一样
代码实现
创建支付方式的类
//创建一个支付渠道,支付类都实现这个接口
public interface Payment {
public PayState pay(String uid, double 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 UnionPay implements Payment {
@Override
public PayState pay(String uid, double amount) {
System.out.println("欢迎使用银联卡支付");
System.out.println("查询账户余额,开始扣款");
return new PayState(200,"支付成功",amount);
}
}
//微信
public class WechatPay implements Payment {
@Override
public PayState pay(String uid, double amount) {
System.out.println("欢迎使用微信支付");
System.out.println("直接从微信红包扣款");
return new PayState(200,"支付成功",amount);
}
}
//支付类型,通过这个类获取支付得方式,可以随时切换
public enum PayType {
ALI_PAY(new AliPay()),
WECHAT_PAY(new WechatPay()),
UNION_PAY(new UnionPay()),
JD_PAY(new JDPay());
private Payment payment;
PayType(Payment payment){
this.payment = payment;
}
public Payment get(){ return this.payment;}
}
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的过程,不需要在代码逻辑中写switch了
//更不需要写if else if
public PayState pay(PayType payType){
return payType.get().pay(this.uid,this.amount);
}
}
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));
//BeanFactory
//根据url去自动选择
//爬取百度的数据 BaiduParser
// SinaParser
// SougouParser
//返回一个解析好的Json格式,统一好了,保存入库
}
}
打印结果如下
欢迎使用微信支付
直接从微信红包扣款
支付状态:[200],支付成功,交易详情:324.45