这时候我们客户端代码就应该这样写了
public class Test { public static void main(String[] args) { PromotionActivity activity618 = new PromotionActivity(new CouponStrategy()); PromotionActivity activityllll = new PromotionActivity(new CashbackStrategy()); activity618.execute(); activityllll.execute(); } }
运行效果如下:
使用优惠券抵扣
代码优化之后 , 是不是我们程序猿小哥哥的维护工作就轻松了?每次上新活动,不影响原来的代码
逻辑。
用策略模式实现选择支付方式的业务场景
为了加深对策略模式的理解,我们再来举一个案例。 相信小伙伴们都用过支付宝、微信支付、银联
支付以及京东白条。 —个常见的应用场景就是大家在下单支付时会提示选择支付方式,如果用户未选,
系统也会默认好推荐的支付方式进行结算。来看一下类图,下面我们用策略模式来描拟此业务场罢 :
创建 Payment 抽象类,定义支付规范和支付逻辑,代码如下 :
public abstract class Payment { public abstract String getName(); //通用逻辑放到抽象类里面实现 public MsgResult pay(String uid, double amount) { //余额是否足够 if (queryBalance(uid) < amount) { return new MsgResult(500, "支付失败", "余额不足"); } return new MsgResult(200, "支付成功", "支付金额" + amount); } protected abstract double queryBalance(String uid); }
分别创建具体的支付方式,支付宝 AliPay类 :
public class AliPay extends Payment { public String getName() { return "支付宝"; } protected double queryBalance(String uid) { return 900; } }
京东白条JDPay 类 :
public class JDPay extends Payment { public String getName() { return "京东白条"; } protected double queryBalance(String uid) { return 500; } }
微信支付 WechatPay类 :
public class WechatPay extends Payment { public String getName() { return "微信支付"; } protected double queryBalance(String uid) { return 263; } }
银联支付 UnionPay 类 :
public class UnionPay extends Payment { public String getName() { return "银联支付"; } protected double queryBalance(String uid) { return 120; } }
创建支付状态的包装类 MsgResult:
public class MsgResult { private int code; private Object data; private String msg; public MsgResult(int code, String msg, Object data) { this.code = code; this.data = data; this.msg = msg; } @Override public String toString() { return "MsgResult{" + "code=" + code + ", data=" + data + ", msg='" + msg + '\'' + '}'; } }
创建支付策略管理类 :
public class PayStrategy { public static final String ALI_PAY = "AliPay"; public static final String JD_PAY = "JdPay"; public static final String WECHAT_PAY = "WechatPay"; public static final String UNION_PAY = "UnionPay"; public static final String DEFAULT_PAY = ALI_PAY; private static Map<String,Payment> strategy = new HashMap<String,Payment>(); static { strategy.put(ALI_PAY,new AliPay()); strategy.put(JD_PAY,new JDPay()); strategy.put(WECHAT_PAY,new WechatPay()); strategy.put(UNION_PAY,new UnionPay()); } public static Payment get(String payKey){ if(!strategy.containsKey(payKey)){ return strategy.get(DEFAULT_PAY); } return strategy.get(payKey); } }
创建订单 Order 类 :
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 MsgResult pay(){ return pay(PayStrategy.DEFAULT_PAY); } public MsgResult pay(String payKey){ Payment payment = PayStrategy.get(payKey); System.out.println("欢迎使用" + payment.getName()); System.out.println("本次交易金额为" + amount + ",开始扣款"); return payment.pay(uid,amount); } }
测试代码 :
public class Test { public static void main(String[] args) { Order order = new Order("1","2020031401000323",324.5); System.out.println(order.pay(PayStrategy.UNION_PAY)); } }
运行结果 :
欢迎使用银联支付 本次交易金额为324.5,开始扣款 MsgResult{code=500, data=余额不足, msg='支付失败'}
希望通过大家耳熟能详的业务场景来举例,让小伙伴们更深刻地理解策略模式。希望小伙伴们在面
试和工作体现出自己的优势。