什么是策略模式:
策略模式就是:定义一组或者系列算法,然后将这些算法封装,可以实现算法的切换。
策略模式应用场景:
策略模式一般用于封装系列的计算方法,这些算法通常封装在一个context的类中。
在程序里面我们可以自由地选择其中一种算法。最常见的应用场景比如商场商品的
促销折扣计算。
用switch我们也可以实现这些功能,只不过代码扩展性不好,如果我们需要加入一
个折扣的计算,那么我们改动的地方较多。
public interface DiscountStrategy {
//计算打折价的方法
public abstract double getDiscount(double originalPrice);
}
提供两种实打折算法的实现类
public class VipDiscount implements DiscountStrategy {
//提供VIP的打折算法
public double getDiscount(double originalPrice) {
System.out.println("使用VIP打折");
return originalPrice*0.5;
}
}
public class OldDiscount implements DiscountStrategy{
//提供旧物品的打折算法
public double getDiscount(double originalPrice) {
System.out.println("使用旧物品打折");
return originalPrice*0.8;
}
}
//提供一个DiscountContext用于调用者选择合适的折扣策略
public class DiscountContext {
private DiscountStrategy strategy;
public DiscountContext(DiscountStrategy strategy) {
this.strategy = strategy;
}
public double getDiscountPrice(double price){
//if promo strategy not be specified, a default strategy is provided
if(strategy == null){
strategy = new OldDiscount();
}
return strategy.getDiscount(price);
}
//Implement toggling strategy
public void changeDiscount(DiscountStrategy strategy){
this.strategy = strategy;
}
}
测试类:
public class DiscountTest {
public static void main(String[] args) {
//不指定策略,则使用默认的策略模式
DiscountContext context = new DiscountContext(null);
double originalPrice1 = 80;
context.getDiscountPrice(originalPrice1);
//选择vip折扣
context.changeDiscount(new VipDiscount());
double originalPrice2 =101;
context.getDiscountPrice(originalPrice2);
}
}