策略模式
1. 定义与类型
- 定义:定义了算法家族,别离封装起来,让他们之间能够相互转换,此模式让算法的变动不会影响到应用算法的用户
- if…else
- 类型: 行为型
2. 实用场景
- 零碎有很多类,而他们的区别仅仅在于他们的行为不同
- 一个零碎须要动静地在几种算法中抉择一种
3. 长处
- 开闭准则
- 防止应用多种条件转移语句
- 进步算法的保密性和安全性
4. 毛病
- 客户端必须晓得所有的策略类,并自行决定应用哪一个策略类
- 产生很多策略类
5. 相干设计模式
- 策略模式 和 工厂模式
- 策略模式 和 状态模式
6.Coding
策略模式加工厂模式
- 创立策略接口 Promotion
public interface PromotionStrategy {void doPromotion();
}
- 创立一系列促销策略
public class FanXianPromotionStrategy implements PromotionStrategy{
@Override
public void doPromotion() {System.out.println("返现促销, 返回的余额寄存到用户余额中!");
}
}
public class LiJianPromotionStrategy implements PromotionStrategy {
@Override
public void doPromotion() {System.out.println("立减促销, 课程的价格间接减去配置的价格");
}
}
public class ManJianPromotionStrategy implements PromotionStrategy{
@Override
public void doPromotion() {System.out.println("满减促销:满 200 减 20");
}
}
- 创立促销流动:用来执行促销策略的类
public class PromotionActivity {
private PromotionStrategy strategy;
public PromotionActivity(PromotionStrategy strategy){this.strategy = strategy;}
public void executeStrategy(){strategy.doPromotion();
}
}
- 创立促销策略工厂
/**
* @program: design_pattern
* @description: 促销策略工厂
* @create: 2021-10-13 22:23
**/
public class PromotionStrategyFactory {
/** 私有化结构器 */
private PromotionStrategyFactory(){}
private static final Map<String,PromotionStrategy> PROMOTION_STRATEGY_MAP = new HashMap<>();
// 初始化工厂
static {PROMOTION_STRATEGY_MAP.put(PromotionType.FANXIAN,new FanXianPromotionStrategy());
PROMOTION_STRATEGY_MAP.put(PromotionType.LIJIAN,new LiJianPromotionStrategy());
PROMOTION_STRATEGY_MAP.put(PromotionType.MANJIAN,new ManJianPromotionStrategy());
}
/** 对外提供获取策略的办法 */
public static PromotionStrategy getPromotionStrategy(String promotionKey){PromotionStrategy promotionStrategy = PROMOTION_STRATEGY_MAP.get(promotionKey);
return promotionStrategy == null?null:promotionStrategy;
}
private interface PromotionType{
String LIJIAN = "LIJIAN";
String MANJIAN = "MANJIAN";
String FANXIAN = "FANXIAN";
}
}
- 测试类
public class Test {public static void main(String[] args) {
String promotionKey = "LIJIAN";
PromotionActivity promotionActivity =
new PromotionActivity(PromotionStrategyFactory.getPromotionStrategy(promotionKey));
promotionActivity.executeStrategy();}
}
- 控制台输入:
7. 总结
- 策略模式联合工厂模式缩小了 if…else 代码,进步了代码的效率和可维护性
- 代码的解耦
- 策略类中都有独特的行为,不过这个行为的后果不一样