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);
评论