还记得面向对象的三大特性吗?封装、继承、多态,策略模式是多态很好的体现。
策略模式的应用
曾几何时,在老东家(不能告诉你们)做代码搬运工时,曾两次应用过策略模式。
其一,销售体系中,客户分为不同类型,卖给客户商品的价格也是不同的,根据不同客户类型,决定客户购买商品价格。
其二,营销体系中,商家搞的活动,满减、满折、满赠、返利等各种优惠,通过客户满足的不同优惠活动,计算客户最终购买商品的实际价格。
策略模式的代码示例
// 策略接口
public interface Strategy {
double discountPrice(double money);
}
// 正常价格
public class StrategyNormal implement Strategy {
@Override
public double discountPrice(double money) {
return money;
}
}
// 满减价格
public class StrategyReduce implement Strategy {
private double target;
private double reduce;
public StrategyReduce(double target, double reduce) {
Assert.isTrue(target >= reduce, "目标金额不能小于优惠金额");
this.target = target;
this.reduce = reduce;
}
@Override
public double discountPrice(double money) {
return (money >= target) ? (money - reduce) : money;
}
}
// 满折价格
public class StrategyDiscount implement Strategy {
private double target;
private double discount;
public StrategyDiscount(double target, double discount) {
Assert.isTrue(discount >= 0 && discount <=1, "折扣比例超出范围");
this.target = target;
this.discount = discount;
}
@Override
public double discountPrice(double money) {
return (money >= target) ? (money * discount) : money;
}
}
// 聚合策略
public class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public double finalPrice(double money) {
return strategy.discountPrice(money);
}
}
// main方法
public static void main(String[] args) {
Context context = null;
Scanner scanner = new Scanner(System.in);
System.out.println("请输入策略类型");
int strategy = scanner.next();
switch(strategy) {
case 1:
System.out.println("请输入目标金额");
double target = scanner.next();
System.out.println("请输入满减金额");
double reduce = scanner.next();
context = new Context(new StrategyReduce(target, reduce));
break;
case 2:
System.out.println("请输入目标金额");
double target = scanner.next();
System.out.println("请输入满折金额");
double discount = scanner.next();
context = new Context(new StrategyDiscount(target, discount));
break;
default:
System.out.println("请输入正确的策略类型1/2");
break;
}
System.out.println("请输入商品金额");
double money = scanner.next();
double totalprice = context.finalPrice(money);
System.out.println("商品最终金额" + totalprice);
}