定义:
定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化不会影响到使用算法的用户。
消除掉 if…else
适用场景:
系统有很多类,而他们的区别仅仅在于他们的行为不同
一个系统需要动态地在几种算法中选择一种
优点:
开闭原则
避免使用多重条件转移语句
提高算法的保密性和安全性
缺点:
客户端必须知道所有的策略类,并自行决定使用哪一种策略类
产生很多的策略类
相关设计模式:
策略模式和工厂模式
策略模式和状态模式
Coding:
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 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 LiJianPromotionStrategy());
PromotionActivity promotionActivity1111 = new PromotionActivity(new FanXianPromotionStrategy());
promotionActivity618.executePromotionStrategy();
promotionActivity1111.executePromotionStrategy();
}
}
策略模式 + 工厂方法
import java.util.HashMap;
import java.util.Map;
public class PromotionStrategyFactory {
private static Map<String, PromotionStrategy> PROMOTION_STRATEGY_MAP = new HashMap();
static {
PROMOTION_STRATEGY_MAP.put(PromotionStrategyKey.FANXIAN, new FanXianPromotionStrategy());
PROMOTION_STRATEGY_MAP.put(PromotionStrategyKey.LIJIAN, new LiJianPromotionStrategy());
PROMOTION_STRATEGY_MAP.put(PromotionStrategyKey.MANJIAN, new ManJianPromotionStrategy());
}
private static PromotionStrategy emptyPromotionStrategy = new EmptyPromotionStrategy();
public static PromotionStrategy getPromotionStrategy(String promotionStrategyKey){
PromotionStrategy promotionStrategy = PROMOTION_STRATEGY_MAP.get(promotionStrategyKey);
return promotionStrategy == null ? emptyPromotionStrategy : promotionStrategy;
}
private interface PromotionStrategyKey {
String FANXIAN = "FANXIAN";
String LIJIAN = "LIJIAN";
String MANJIAN = "MANJIAN";
}
}
public class Test {
public static void main(String[] args) {
String promotionStrategyKey = "LIJIAN";
PromotionActivity promotionStrategy = new PromotionActivity(PromotionStrategyFactory.getPromotionStrategy(promotionStrategyKey));
promotionStrategy.executePromotionStrategy();
}
}
JDK中java.util.Comparator就是一种策略模式,有多种实现策略。
1、java.util.Arrays#parallelSort(T[], java.util.Comparator<? super T>) 通过传入的比较器进行排序
2、java.util.TreeMap#TreeMap(java.util.Comparator<? super K>)
3、org.springframework.core.io.Resource 的多种实现 也是策略模式
4、SpringBean的初始化:org.springframework.beans.factory.support.InstantiationStrategy