horizonheart 2013-10-13
策略模式就是:定义一组或者系列算法,然后将这些算法封装,可以实现算法的切换。
策略模式一般用于封装系列的计算方法,这些算法通常封装在一个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); } }