定义
定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化不会影响到使用算法的用户。
类型
行为型
适用场景
- 系统有很多类,而他们的区别仅仅在于他们的行为不同
- 一个系统需要动态地在几种算法中选择一种
优点
- 开闭原则
- 避免使用多重条件转移语句
- 提高算法的保密性和安全性
缺点
- 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
- 产生很多策略类
Coding
假如这样一个场景,课程有促销活动,促销策略有满减、立减、返现等
// 促销策略基类
public interface PromotionStrategy {
void doPromotion();
}
// 满减
public class ManJianPromotionStrategy implements PromotionStrategy {
public void doPromotion() {
System.out.println("满减促销,满200-20");
}
}
// 立减
public class LiJianPromotionStrategy implements PromotionStrategy {
public void doPromotion() {
System.out.println("立减促销,课程的价格直接减去配置的价格");
}
}
// 返现
public class FanXianPromotionStrategy implements PromotionStrategy {
public void doPromotion() {
System.out.println("返现促销,返回的金额存放到用户余额中");
}
}
// 促销活动类
public class PromotionActivity {
private PromotionStrategy promotionStrategy;
public PromotionActivity(PromotionStrategy promotionStrategy) {
this.promotionStrategy = promotionStrategy;
}
public void executePromotionStrategy(){
promotionStrategy.doPromotion();
}
}
看下客户端调用:
public class Test {
public static void main(String[] args) {
PromotionActivity promotionActivity618 = new PromotionActivity(new ManJianPromotionStrategy());
PromotionActivity promotionActivity1111 = new PromotionActivity(new FanXianPromotionStrategy());
promotionActivity618.executePromotionStrategy();
promotionActivity1111.executePromotionStrategy();
}
}
// console
// 满减促销,满200-20
// 返现促销,返回的金额存放到用户余额中
如果不是用策略模式的话,平时是把所有策略的具体实现放到 PromotionActivity 的 executePromotionStrategy 方法里,通过if else 区分,形成一个较大的方法。
改进
现在的这种写法还是无法消除完if else语句,因为我们真实环境客户端调用时,可能要写成这样:
public class Test {
public static void main(String[] args) {
// 入参
String promotionKey = "LIJIAN";
PromotionActivity promotionActivity = null;
if ("LIJIAN".equals(promotionKey)){
promotionActivity = new PromotionActivity(new LiJianPromotionStrategy());
} else if ("MANJIAN".equals(promotionKey)){
promotionActivity = new PromotionActivity(new ManJianPromotionStrategy());
} // ...
promotionActivity.executePromotionStrategy();
}
}
每次都需要根据情况new一个策略和活动。
结合工厂改进
// 工厂类
public class PromotionStrategyFactory {
private PromotionStrategyFactory(){}
private static Map<String, PromotionStrategy> PROMOTION_STRATEGY_MAP = new HashMap<>();
static {
PROMOTION_STRATEGY_MAP.put(PromotionKey.MANJIAN, new ManJianPromotionStrategy());
PROMOTION_STRATEGY_MAP.put(PromotionKey.LIJIAN, new LiJianPromotionStrategy());
PROMOTION_STRATEGY_MAP.put(PromotionKey.FANXIAN, new FanXianPromotionStrategy());
}
private static final PromotionStrategy NON_PROMOTION = new EmptyPromotionStrategy();
public static PromotionStrategy getPromotionStrategy(String promotionKey){
PromotionStrategy promotionStrategy = PROMOTION_STRATEGY_MAP.get(promotionKey);
return promotionStrategy == null ? NON_PROMOTION : promotionStrategy;
}
private interface PromotionKey{
String LIJIAN = "LIJIAN";
String MANJIAN = "MANJIAN";
String FANXIAN = "FANXIAN";
}
}
public class EmptyPromotionStrategy implements PromotionStrategy {
public void doPromotion() {
System.out.println("啥都不做");
}
}
现在的客户端调用:
public static void main(String[] args) {
String promotionKey = "LIJIAN";
PromotionActivity promotionActivity = new PromotionActivity(PromotionStrategyFactory.getPromotionStrategy(promotionKey));
promotionActivity.executePromotionStrategy();
}
如果帮到你了,请点击右上角给个赞吧!!
学习笔记。内容总结于Geely老师的《Java设计模式精讲 》
欢迎访问我的博客: 他和她的猫