策略模式,可以使算法的变化独立于使用它们业务代码,在实际项目开发中,常利用它来避免冗长的 if-else 分支判断,或者提供扩展点等。
优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。
缺点: 1、策略类会膨胀。 2、所有策略类都需要对外暴露。
注意事项:如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。
实现类
代码示例
首先创建策略接口
public interface Strategy {
public int operate(int num1, int num2);
}
然后创建上下文Context类
public class Context {
private Strategy strategy;
public Context(Strategy strategy){
this.strategy = strategy;
}
public int execute(int num1, int num2){
return strategy.operate(num1, num2);
}
}
接者实现具体的策略类
public class Add implements Strategy{
@Override
public int operate(int num1, int num2) {
return num1 + num2;
}
}
public class Subtract implements Strategy{
@Override
public int operate(int num1, int num2) {
return num1 - num2;
}
}
public class Multiply implements Strategy{
@Override
public int operate(int num1, int num2) {
return num1 * num2;
}
}
最后,就可以在具体的业务代码中使用该策略模式
Context context = new Context(new Add());
System.out.println("10 + 5 = " + context.execute(10, 5));
context = new Context(new Subtract());
System.out.println("10 - 5 = " + context.execute(10, 5));
context = new Context(new Multiply());
System.out.println("10 * 5 = " + context.execute(10, 5));
最后的最后,利用策略模式并结合工厂类避免业务代码中冗长的分支判断
// 策略的定义
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());
}
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);
}
}