写点什么

策略模式

用户头像
Geek_571bdf
关注
发布于: 2 小时前

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


用户头像

Geek_571bdf

关注

还未添加个人签名 2019.06.13 加入

还未添加个人简介

评论

发布
暂无评论
策略模式