策略模式是一种行为设计模式,它的用途是1.使代码更加的优雅2. 逻辑更清晰,便于扩展3.符合开闭原则
现在有一个问题,如果小明想做一件事,但是呢有100种选择,每种选择的逻辑都不一样,那我们在代码实现中是不是要写100个if-else,那这样会很不美观,且不易于维护,那代码就可能长下面这样
if ("COUPON".equals(type)) {
// 优惠券逻辑
} else if ("FULL_REDUCTION".equals(type)) {
// 满减逻辑
} else if ("VIP".equals(type)) {
// VIP 折扣逻辑
} ...........以下省略100个if-else
那对于这种不同的条件有着不同的逻辑,我们就可以使用策略模式进行优化,策略模式的核心在于为算法的实现提供统一的接口,并通过动态选择具体实现来实现灵活性
说人话就是我们先写一个接口定义共有逻辑,然后创建不同的类(具体策略)继承这个接口,这样每种逻辑都封装到了对应的类里,最后实现用到了一个Spring的特性,当你写 @Autowired Map<String, DiscountStrategy>
Spring 会把 容器里所有实现了 DiscountStrategy 的 Bean 都收集起来,塞进这个 Map,key 是 Bean 的名字,value 是 Bean 实例,演示代码如下:
public interface DiscountStrategy {
BigDecimal calculate(Order order);
}
@Component("COUPON")
public class CouponDiscount implements DiscountStrategy {
public BigDecimal calculate(Order order) {
// ...
}
}
@Component("VIP")
public class VipDiscount implements DiscountStrategy {
public BigDecimal calculate(Order order) {
// ...
}
}
@Service public class DiscountService {
@Autowired private Map<String, DiscountStrategy> strategyMap;
public BigDecimal discount(String type, Order order) {
return strategyMap.get(type).calculate(order);
}
}
最后也容易看出一个问题 策略模式的一个可能算的缺点就是要创建新的类
浙公网安备 33010602011771号