1. 什么是策略模式?策略模式的作用
2. 策略模式如何避免冗长的 if-else;策略模式的实现
1. 什么是策略模式?策略模式的作用。
定义一族算法类,将每个算法分别封装起来,让它们可以互相替换。策略模式可以使算法的变化独立于使用它们的客户端。
一个完整的策略模式包含:策略的定义(一个策略接口和一组实现该接口的类)、创建(策略工厂)、使用(根据 type 返回不同的策略实现类)。
2. 使用策略模式,可以避免冗长的 if-else:
public interface DiscountStrategy {// 策略的定义
double calDiscount(Order order);
}
// 省略NormalDiscountStrategy、GrouponDiscountStrategy、PromotionDiscountStrategy类代码...
public class DiscountStrategyFactory {// 策略的创建
private static final Map<OrderType, DiscountStrategy> strategies = new HashMap<>();
static {
strategies.put(OrderType.NORMAL, new NormalDiscountStrategy());
strategies.put(OrderType.GROUPON, new GrouponDiscountStrategy());
strategies.put(OrderType.PROMOTION, new PromotionDiscountStrategy());
}
// 如果需要每次返回新建对象,又不想有一串if-else,可以使用工厂方法,或者反射
/**
static {
strategyMap.put("vip", VipStrategy.class);
strategyMap.put("new", NewUserStrategy.class);
strategyMap.put("old", OldUserStrategy.class);
}
Class<?> clazz = strategyMap.get(type);
if (clazz != null) {
Constructor constructor = clazz.getConstructor();
return (Strategy) constructor.newInstance();
}
*/
public static DiscountStrategy getDiscountStrategy(OrderType type) {
return strategies.get(type);
}
}
// 策略的使用
public class OrderService {
public double discount(Order order) {
OrderType type = order.getType();
DiscountStrategy discountStrategy = DiscountStrategyFactory.getDiscountStrategy(type);
return discountStrategy.calDiscount(order);
// 如果不使用策略模式:
//if (type.equals(OrderType.NORMAL)) { // 普通订单
//...省略折扣计算算法代码
//} else if (type.equals(OrderType.GROUPON)) { // 团购订单
//...省略折扣计算算法代码
//} else if (type.equals(OrderType.PROMOTION)) { // 促销订单
//...省略折扣计算算法代码
//}
}
}
复制代码
事实上,避免 if-else,套路本质上都是利用“查表法”(Map)。比如工厂模式中的 Map
另外,客户端可以通过 运行时动态确定使用哪种策略,“运行时动态”指的是,我们事先并不知道会使用哪个策略,而是在程序运行期间,根据配置、用户输入、计算结果等这些不确定因素,动态决定使用哪种策略。
Properties props = new Properties();
props.load(new FileInputStream("./config.properties"));
String type = props.getProperty("eviction_type");
evictionStrategy = EvictionStrategyFactory.getEvictionStrategy(type);
评论