策略模式

定义

策略模式(Strategy Pattern) ,一个功能,提供了多种实现方式,它们之间可以相互替换,我们通过条件选择一种方式实现目标,属于行为型模式。

策略使用的就是面向对象的集成和多态机制,从而实现同一行为在不同场景下具备不同实现。例如支付的多种方式。与委派模式不同,委派模式注重的是结果,将任务分派给某个角色,具体任务怎么执行,对调用者完全透明,调用者只关心结果;而策略模是通过某个条件拿到一个具体解决方案,最终还是要自己去调用执行。

image-20210623171451116

//支付方式通用父类
public abstract class Payment {
   //支付方式
   protected abstract String getName();

   //查询余额
   protected abstract double queryBalance(String uid);

   //扣款
   public MsgResult pay(String uid, double amount){
       double balance = queryBalance(uid);
       if(amount <= balance) {
           balance = balance - amount;
           return new MsgResult(200, "支付成功", String.format("支付%s元,剩余%s元", amount, balance));
      }else{
           return new MsgResult(500, "支付失败", String.format("余额不足,当前余额%s元,需要支付%s元"));
      }
  }
}
//ali支付
public class AliPay extends Payment{
   @Override
   protected String getName() {
       return "支付宝";
  }

   @Override
   protected double queryBalance(String uid) {
       return 900;
  }
}
//京东支付
public class JDPay extends Payment{
   @Override
   protected String getName() {
       return "京东钱包";
  }

   @Override
   protected double queryBalance(String uid) {
       return 600;
  }
}
//支付方式工厂
public class PaymentFactory {
   public static final Map<String, Payment> paymentMap = new HashMap<>();

   public static String DEFAULT_PAYMENT_KEY = "ali";

   static{
       AliPay aliPay = new AliPay();
       JDPay jdPay = new JDPay();
       paymentMap.put("ali",aliPay);
       paymentMap.put("jd",jdPay);
  }

   public static Payment getPayment(String key){
       Payment result = null;
       if(paymentMap.containsKey(key)){
           result = paymentMap.get(key);
      }else{
           result = paymentMap.get(DEFAULT_PAYMENT_KEY);
      }
       return result;
  }
}
//返回实体类
public class MsgResult {
   private int code;
   private String msg;
   private Object data;

   public MsgResult(int code, String msg, Object data) {
       this.code = code;
       this.msg = msg;
       this.data = data;
  }
}
//订单对象
public class Order {
   private String orderId; //订单ID
   private String uid; //用户id
   private double amount; //订单金额

   public Order(String orderId, String uid, double amount) {
       this.orderId = orderId;
       this.uid = uid;
       this.amount = amount;
  }
   
    public void pay(){
       pay(PaymentFactory.DEFAULT_PAYMENT_KEY);
  }

   public void pay(String key){
       Payment payment = PaymentFactory.getPayment(key);
       System.out.println("欢迎使用" + payment.getName());
       System.out.println("本次消费金额:" + amount + "元");
       MsgResult payresult = payment.pay(uid, amount);
       System.out.println(payresult);
  }
}
//测试类
public class Test {
   public static void main(String[] args) {
       Order order = new Order("001", "1", 200);
       order.pay();
  }
}

策略模式优缺点:

  1. 扩展方便,符合开闭原则

  2. 简化了调用者的调用逻辑 避免if else判断

  3. 提供具体策略实现的保密性和安全性

缺点:

  1. 会产生很多的策略类 ,容易类膨胀

  2. 客户需要知道所有的策略 并且自行决定使用哪一个策略

posted @ 2021-07-06 11:13  醉梦了红尘  阅读(205)  评论(0)    收藏  举报