策略模式-设计模式
1. 介绍
1.1 定义
策略模式是属于一个行为型的设计模式,定义一系列算法,将每个算法封装到具有公共接口的一系列策略类中,从而使它们可以相互替换 & 让算法可在不影响客户端的情况下发生变化。简单来说:准备一组算法 & 将每一个算法封装起来,让外部按需调用 & 使得互换。
1.2应用场景
①:系统中有很多实现类,而他们的区别仅仅在于行为不同。
②:一个系统需要动态地在集中算法中选择一种。
2. 模式原理
2.1 UML类图 & 组成
3.代码
首先定义一个抽象的业务类,也就是一个方法的总类,该抽象类里面有抽象的方法,或者该类是接口也是可以的,其实也就是面向接口(抽象类)来进行的业务实现。
1 package com.test.study.springbootstudy.test.partten.strategy1;
2
3 public abstract class Payment {
4
5 public abstract String getName();
6
7 protected abstract Double queryBalance(String uid);
8
9 public PayState<String> pay(String uid, double amout){
10 if(queryBalance(uid) < 500){
11 return new PayState(500, "支付失败", "余额不足");
12 }
13 return new PayState<>(200, "支付成功", "支付金额" + amout);
14 }
15
16
17 }
定义一个业务实现类1,代码如下所示:
package com.test.study.springbootstudy.test.partten.strategy1; public class AliPay extends Payment{ @Override public String getName() { return "支付宝"; } @Override protected Double queryBalance(String uid) { return 900D; } }
定义一个业务实现类2,代码如下所示:
1 package com.test.study.springbootstudy.test.partten.strategy1; 2 3 public class WechatPay extends Payment{ 4 5 @Override 6 public String getName() { 7 return "微信支付"; 8 } 9 10 @Override 11 protected Double queryBalance(String uid) { 12 return 200D; 13 } 14 15 }
定义一个状态码类,代码如下所示:
package com.test.study.springbootstudy.test.partten.strategy1; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.ToString; @Data @AllArgsConstructor @NoArgsConstructor @ToString public class PayState<T> { private int code; private T t; private String msg; }
定义一个策略类,该类是一个重点类,其实也是可以使用工厂模式来进行实现,其实也就是把业务实现类创建成对象,然后把对象放到map里面,代码如下所示:
package com.test.study.springbootstudy.test.partten.strategy1; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; public class PayStrategy { public static final String ALI_PAY = "ALI_PAY"; public static final String WE_CHAT_PAY = "WE_CHAT_PAY"; private static Map<String, Payment> map = new ConcurrentHashMap<>(); static { map.put(ALI_PAY, new AliPay()); map.put(WE_CHAT_PAY, new WechatPay()); } public static Payment get(String payKey){ return map.get(payKey); } }
定义一个订单类,代码如下所示:
package com.test.study.springbootstudy.test.partten.strategy1; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor public class Order { private String uid; private String orderId; private Double amount; public PayState<String> pay(){ return pay(PayStrategy.ALI_PAY); } public PayState<String> pay(String payKey){ Payment payment = PayStrategy.get(payKey); System.out.println("欢迎使用:"+payment.getName()); System.out.println("本次交易金额为:"+ amount +", 开始扣款。。"); return payment.pay(uid, amount); } }
定义一个测试类,代码如下所示:
package com.test.study.springbootstudy.test.partten.strategy1; public class PayStrategyTest { public static void main(String[] args) { Order order = new Order("dd12344", "df464325566", 100D); System.out.println(order.pay()); } }
4.策略模式的优缺点
策略模式的优点如下所示:
①:策略模式符合开闭原则
②:策略模式可以避免使用多重条件语句,如if...else语句、switch语句
③:使用策略模式可以提高算法的保密性和安全性
策略模式的缺点如下所示:
①:客户端必须知道所有的策略,并且自行决定使用哪一种策略
②:代码中会产生非常多的策略类,增加了代码的维护难度
郭慕荣博客园