一、定义:
定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化不会影响到使用算法的用户
方法中有大量的if...else...
类型:行为型
二、适用场景
系统有很多类,而他们的区别仅仅在于他们的行为的不同
一个系统需要动态地在几种算法(策略)中选择一种
三、优点
1、开闭原则
2、避免使用多种条件转移语句if..else
3、提高算法的保密性和安全性
四、缺点
1、客户端必须知道所有的策略类,并自行决定使用哪一种策略类
2、产生很大策略类
五、策略模式-相关设计模式
1、策略模式和工厂模式(工厂方法、抽象工厂)
工厂模式:创建型设计模式。接受指令,创建符合要求的对象
策略模式:行为型设计模式。接受已经创建好的对象,从而实现不同的行为。
2、策略模式和状态模式
策略模式:客户端需要知道选择哪个策略
状态模式:客户端不需要关系具体的状态,这些状态可以自动转换。
六、Conding
课程促销行为,促销策略:满减策略,发现促销策略
1、PromotionStrategy 接口
/**
* 促销策略
*/
public interface PromotionStrategy {
void doPromotion();
}
2、FanXianPromotionStrategy 类
/**
* 反现策略
*/
public class FanXianPromotionStrategy implements PromotionStrategy{
@Override
public void doPromotion() {
System.out.println("反现促销,返回的金额放到余额中。");
}
}
3、LiJianPromotionStrategy类
/**
* 立减策略
*/
public class LiJianPromotionStrategy implements PromotionStrategy{
@Override
public void doPromotion() {
System.out.println("立减促销,课程的价格返回配置的价格");
}
}
4、ManJianPromotionStrategy 类
/**
* 满减策略
*/
public class ManJianPromotionStrategy implements PromotionStrategy{
@Override
public void doPromotion() {
System.out.println("满减促销,满200元,减20元");
}
}
5、PromotionActivity 类
/**
* 促销活动
*/
public class PromotionActivity {
private PromotionStrategy promotionStrategy;
public PromotionActivity(PromotionStrategy promotionStrategy) {
this.promotionStrategy = promotionStrategy;
}
public void execute(){
this.promotionStrategy.doPromotion();
}
}
6、测试
public class Test {
public static void main(String[] args) {
PromotionActivity promotionActivity618 = new PromotionActivity(new LiJianPromotionStrategy()) ;
PromotionActivity promotionActivity1111 = new PromotionActivity(new FanXianPromotionStrategy()) ;
promotionActivity618.execute();
promotionActivity1111.execute();
}
}
7、UML图

七、Coding演进
上面的方法缺点:还是不能去除if...else...
升级:
1、PromotionStrategyFactory 类
/**
* 促销策略工厂
*/
public class PromotionStrategyFactory {
private static Map<String, PromotionStrategy> PROMOTION_STRATEGY_MAP = new HashMap<>();
static {
PROMOTION_STRATEGY_MAP.put(PromationKey.LIJIAN, new LiJianPromotionStrategy());
PROMOTION_STRATEGY_MAP.put(PromationKey.FANXIAN, new FanXianPromotionStrategy());
PROMOTION_STRATEGY_MAP.put(PromationKey.MANJIAN, new ManJianPromotionStrategy());
}
private static final PromotionStrategy NONE_PROMATION = new EmptyPromotionStrategy();
private PromotionStrategyFactory(){
}
public static PromotionStrategy getPromotionStrategy(String promotionKey){
PromotionStrategy promotionStrategy = PROMOTION_STRATEGY_MAP.get(promotionKey);
return promotionStrategy == null ? NONE_PROMATION : promotionStrategy;
}
private interface PromationKey{
String LIJIAN = "LIJIAN";
String FANXIAN = "FANXIAN";
String MANJIAN = "MANJIAN";
}
}
2、EmptyPromotionStrategy 类
public class EmptyPromotionStrategy implements PromotionStrategy{
@Override
public void doPromotion() {
System.out.println("无促销活动");
}
}
3、测试
public static void main(String[] args) {
String promotionKey = "LIJIAN";
PromotionActivity promotionActivity = new PromotionActivity(PromotionStrategyFactory.getPromotionStrategy(promotionKey));
promotionActivity.execute();
}
这样就消除了If..Else
八、在源码中的使用
1、Comparator

如BooleanComparator,BigDecimalComparator实现了比较器。就好比有多重策略。

2、Spring 中的Resource(策略的抽象)

实现类ClassPathResource(策略的实现)

3、Spring中的初始化策略类

实现类有:
