策略模式
策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是:“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。
类图:
Pay类:
public interface Pay { String getName(); double queryBalance(); double payment(double amount); } |
AliPay类:
public class AliPay implements Pay { @Override public String getName() { return "支付宝支付"; } @Override public double queryBalance() { return 8888; } @Override public double payment(double amount) { double balance = queryBalance(); if(balance >= amount){ System.out.println("使用支付宝支付了" + amount); return balance - amount; } throw new RuntimeException("余额不足"); } } |
WechatPay 类:
public class WechatPay implements Pay{ @Override public String getName() { return "微信支付"; } @Override public double queryBalance() { return 999; } @Override public double payment(double amount) { double balance = queryBalance(); if(balance >= amount){ System.out.println("使用微信支付了" + amount); return balance - amount; } throw new RuntimeException("余额不足"); } } |
PayStrategy类:(策略类)
public class PayStrategy { private static final Map<String,Pay> PAY_MAP = new HashMap<>(); public PayStrategy(){ PAY_MAP.put(PayConstant.ALI_PAY,new AliPay()); PAY_MAP.put(PayConstant.WECHAT_PAY,new WechatPay()); } public double payStrategy(String payType,double amount){ Pay pay = PAY_MAP.get(payType); double balance = pay.payment(amount); System.out.println("余额 : " + balance); return balance; } private interface PayConstant { public static final String ALI_PAY = "aliPay"; public static final String WECHAT_PAY = "wechatPay"; } } |
Order类:
public class Order { private String orderNo; private String id; private double amount; public double orderPay(String payType){ PayStrategy payStrategy = new PayStrategy(); double balance = payStrategy.payStrategy(payType, amount); return balance; } public String getOrderNo() { return orderNo; } public void setOrderNo(String orderNo) { this.orderNo = orderNo; } public String getId() { return id; } public void setId(String id) { this.id = id; } public double getAmount() { return amount; } public void setAmount(double amount) { this.amount = amount; } } |
StrategyTest:(测试类)
public class StrategyTest { public static void main(String[] args) { Order order = new Order(); order.setAmount(99.99); order.setId("000000001"); order.setOrderNo("2019031500000000000009"); order.orderPay("aliPay"); } } |
策略模式优缺点
策略模式的优点:
算法可以自由切换;
避免使用多重条件判断;
扩展性良好。
策略模式的缺点:
策略类会增多
所有策略类都需要对外暴露
策略模式的适用场景:
当一个系统中有许多类,它们之间的区别仅在于它们的行为,希望动态地让一个对象在许多行为中选择一种行为时;
当一个系统需要动态地在几种算法中选择一种时;
当一个对象有很多的行为,不想使用多重的条件选择语句来选择使用哪个行为时。