策略模式简介:
策略模式定义算法,分别封装起来,让他们可以相互替换,此模式的目的是让算法的变化独立于使用方法的用户。(比如:支付接口的选择(支付宝,京东白条,微信支付,银联卡....)),策略模式关心的是我们如何去选择,最终的结果都是一样的
策略模式的应用:1、比较器比较算法的定义 2、支付接口的调用 3、爬虫爬不同网站时使用不同策略但最后都返回相同格式的json
spring中策略模式的应用 :Spring中BeanFactroy有很多种,会根据用户不同的配置决定使用哪个BeanFactroy(工厂模式与策略模式的结合)
策略模式Demo
一支付为例,构建策略模式的demo
/**
* @description: 支付完成后的状态
**/
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;
}
}
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;
}
//PayType 完全可以用Payment 这个接口代替
//为什么?不用接口代替,
// 是因为使用枚举完美的解决了switch的过程
//不需要在代码中写switch 更不需要写 else if
public PayState pay(Integer payType){
return PayType.getPayment(payType).pay(this.uid,this.amount);
}
}
//支付接口,策略接口
public interface Payment {
PayState pay(String uid,double amount);
}
/**
* @description: 增加一个渠道只需要修改枚举即可,姑且把枚举当做常量池来维护
**/
public enum PayType {
ALI_PAY(1,new AliPay()),
WECHAT_PAY(2,new WechatPay()),
JD_PAY(3,new JDPay()),
UNION_PAY(4,new UnionPay());
private Integer type;
private Payment payment;
PayType(Integer type,Payment payment){
this.type = type;
this.payment = payment;
}
public Integer getType() {
return type;
}
public Payment getPayment() {
return payment;
}
//通过 Type 获取支付的Payment
public static Payment getPayment(Integer type){
for (PayType payType : PayType.values()) {
if(payType.getType().equals(type)){
return payType.getPayment();
}
}
return null;
}
}
//支付宝支付算法
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 WechatPay 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 PayStrategyTest {
public static void main(String[] args) {
//省略把商品添加到购物车,再从购物车下单
//直接从订单开始
Order order = new Order("1", "20180311001000009", 2324.1);
//开始支付 选择微信支付宝,微信支付,银联卡,京东白条,财付通
//每个渠道支付的具体算法是不一样的
//基本算法是固定的
// 这个值是用户再支付的时候才决定 用哪个值 若不用payType 去做就要写switch 或者if else
//通过用户传的 payType值获取么=枚举结果值
// 客户只需要传哪一种类型的支付即可 用户在前端页面选择的就是1、2、3,通过枚举映射创建需要的支付策略
System.out.println(order.pay(3));
}
}