1. 类图
- Context:上下文,和具体的策略类交互
- Strategy:策略接口,约束一系列具体的策略算法
- ConcreteStrategy:具体策略算法实现
2. 示例
分离算法,选择实现,算法可任意替换
2.1 策略接口
public interface Strategy {
double calcPrice(double price);
}
2.2 策略实现
public class NormalCustomerStrategy implements Strategy {
@Override
public double calcPrice(double price) {
System.out.println("新客户或普通客户没有折扣!");
return price;
}
}
public class OldCustomerStrategy implements Strategy {
@Override
public double calcPrice(double price) {
System.out.println("老客户统一优惠5%");
return price * (1 - 0.05);
}
}
public class LargeCustomerStrategy implements Strategy {
@Override
public double calcPrice(double price) {
System.out.println("大客户,统一优惠10%");
return price * (1 - 0.1);
}
}
2.3 上下文
public class PriceContext {
private Strategy strategy;
public PriceContext(Strategy strategy){this.strategy = strategy;}
public double quote(double price){
return strategy.calcPrice(price);
}
}
2.4 客户端
public class Client {
public static void main(String[] args) {
// 选择策略对象
Strategy strategy = new LargeCustomerStrategy();
// 价格计算
PriceContext priceContext = new PriceContext(strategy);
// 最终价格
System.out.println("原价1000,最终价格为:" + priceContext.quote(1000));
}
}
3. 优点
- 避免多重if-else语句
- 更好的扩展性
- 动态切换
4. 缺点
- 客户端必须了解每种策略的逻辑
- 增加了类的数量
- 只适用于扁平的算法结构,不支持嵌套算法:如折上折、折后返券