名词解释
Strategy Pattern
定义一系列算法,把它们一个个封装起来,并且使它们之间可以互相替换,此模式让算法的变化不会影响到使用算法的用户
应用场景
- 系统中有很多类,而他们的区别仅仅在于他们的行为不同
- 一个系统需要动态地在几种算法中选择一种
写法
策略模式的写法很简单,其实就是先定义一个接口,然后让不同的算法来分别实现接口,这样在调用算法的地方,直接选择不同的算法实现类就可以了。
通常我们的算法选择是单例类型的,可以考虑用枚举来做选择,这是一种很优雅的方式比如:
/**
* 通过枚举实现策略方式的选择
*/
public enum EnumPromotionFactory {
COUPON(new CouponStrategy()),
CASHBACK(new CashbackStrategy()),
private PromotionStrategy strategy ;
public PromotionStrategy getStrategy() {
return strategy;
}
private EnumPromotionFactory(PromotionStrategy strategy){
this.strategy = strategy;
}
}
另外也可以直接用字符创的方式来区分,比如:
/**
* 促销策略工厂
*/
public class PromotionStrategyFactory {
private static Map<String,PromotionStrategy> PROMOTION_STRATEGY_MAP = new HashMap<String, PromotionStrategy>();
static {
PROMOTION_STRATEGY_MAP.put(PromotionKey.COUPON,new CouponStrategy());
PROMOTION_STRATEGY_MAP.put(PromotionKey.CASHBACK,new CashbackStrategy());
}
private static final PromotionStrategy NON_PROMOTION = new EmptyStrategy();
private PromotionStrategyFactory(){}
public static PromotionStrategy getPromotionStrategy(String promotionKey){
PromotionStrategy promotionStrategy = PROMOTION_STRATEGY_MAP.get(promotionKey);
return promotionStrategy == null ? NON_PROMOTION : promotionStrategy;
}
private interface PromotionKey{
String COUPON = "COUPON";
String CASHBACK = "CASHBACK";
}
}
应用举例
JDK
- 比较器Comparator 接口的 compare()方法
Spring
- Resource
- InstantiationStrategy
小知识
在实际应用中多种策略之间还可以继承使用