策略模式是指定义了一些算法并封装起来,让这些算法可以相互替换但是不影响用户的使用
策略模式适用场景
1.系统中有很多类,但是它们只是执行的行为不同2.一个系统中需要动态的去判断需要使用哪一种算法
业务场景
在实际中,我们购物的时候都会有不同的付账方式。微信、支付宝或者银行卡等我们现在模拟一下这个业务场景。
1.创建支付的抽象类,统一支付逻辑
public abstract class Payment { // 支付类型 public abstract String getName(); // 账户余额 protected abstract double queryBalance(); // 支付方式 public String pay(String id, double amount) { if (queryBalance() >= amount) { return "支付成功,金额为:" + amount; } return "支付失败"; }}
1.实现不同的支付逻辑
public class UnionPay extends Payment{ @Override public String getName() { return "银行卡支付"; } @Override protected double queryBalance() { return 40000; }}public class WeChatPay extends Payment{ @Override public String getName() { return "微信支付"; } @Override protected double queryBalance() { return 2000; }}public class AliPay extends Payment{ @Override public String getName() { return "支付宝支付"; } @Override protected double queryBalance() { return 30000; }}
1.创建一个订单类
public class Order { private String key; private double amount; public Order(String key, double amount) { this.key = key; this.amount = amount; } public String pay() { return pay(PayFun.DEFAULT_PAY); } public String pay(PayFun payFun) { Payment payment = PayStrategy.get(payFun); System.out.println("支付方式:" + payment.getName()); System.out.println("账户余额:" + payment.queryBalance()); return payment.pay(key, amount); }}
1.创建支付方式以及支付策略
public enum PayFun { ALI_PAY, WE_CHAT_PAY, UNION_PAY, DEFAULT_PAY}public abstract class Payment { // 支付类型 public abstract String getName(); // 账户余额 protected abstract double queryBalance(); // 支付方式 public String pay(String id, double amount) { if (queryBalance() >= amount) { return "支付成功,金额为:" + amount; } return "支付失败"; }}
1.测试
public class PayTest { public static void main(String[] args) { Order order = new Order("银行卡", 10000); System.out.println(order.pay(PayFun.UNION_PAY)); }}
1.测试结果
1.类图
策略模式优缺点
1.优点
•符合开闭原则•避免使用过多的if...else..语句•提高算法的安全性和保密性
1.缺点
•客户必须知道所有的策略•增加代码复杂度,使维护难度增大