业务场景
我们可以根据不同的参数来选择一种我们想要执行的优惠计价方式
策略模式,将会成为最最高频使用的一种设计模式
常见应用场景,就是替换掉那一大坨复杂难懂的if else if else
对于那种过于复杂的选择判断逻辑,完全可以将选择哪种策略的过程放到工厂里去
工厂,可以是简单工厂,也可以是工厂方法,也可以是抽象工厂
package com.icode.edu.boot.test.strategy;
public class StrategryPatternDemo {
public static void main(String[] args) {
int discountStyle = 1;
DiscountCalculateStrategy strategy = DiscountCalculateStrategryFactory
.getDiscountCalculateStrategy(discountStyle);
Context context = new Context();
context.setStrategy(strategy);
context.calculate();
/**
* 要点1:必须将if else的代码,封装到不同的策略类中
* 要点2:将选择哪种策略的逻辑给放到一个工厂类中去,选择策略的代码务必很简洁
* 要点3:context可有可无,具体是看你的策略执行这块如果就一行代码调用,不需要context
* 如果context中的策略执行逻辑较为复杂一点,context来封装策略类的执行逻辑
*/
}
public interface DiscountCalculateStrategy {
void calculate();
}
public static class DiscountCalculateStrategyA implements DiscountCalculateStrategy {
@Override
public void calculate() {
System.out.println("执行优惠计价方式1的复杂业务逻辑");
}
}
public static class DiscountCalculateStrategyB implements DiscountCalculateStrategy {
@Override
public void calculate() {
System.out.println("执行优惠计价方式2的复杂业务逻辑");
}
}
public static class DiscountCalculateStrategyC implements DiscountCalculateStrategy {
@Override
public void calculate() {
System.out.println("执行优惠计价方式3的复杂业务逻辑");
}
}
public static class DiscountCalculateStrategyDefault implements DiscountCalculateStrategy {
@Override
public void calculate() {
System.out.println("执行默认的优惠计价方式的复杂业务逻辑");
}
}
public static class DiscountCalculateStrategryFactory {
public static DiscountCalculateStrategy getDiscountCalculateStrategy(int discountStyle) {
if (discountStyle == 1) {
return new DiscountCalculateStrategyA();
} else if (discountStyle == 2) {
return new DiscountCalculateStrategyB();
} else if (discountStyle == 3) {
return new DiscountCalculateStrategyC();
} else {
return new DiscountCalculateStrategyDefault();
}
}
}
public static class Context {
private DiscountCalculateStrategy strategy;
public DiscountCalculateStrategy getStrategy() {
return strategy;
}
public void setStrategy(DiscountCalculateStrategy strategy) {
this.strategy = strategy;
}
public void calculate() {
strategy.calculate();
}
}
}