具体选用哪个报价策略,这需要根据实际情况来确定。这时候,我们采用策略模式即可。
我们先采用条件语句处理
public class Test { public double getPrice(String type,double price){ if(type.equals("普通客户小批量")){ System.out.println("不打折,原价"); return price; }else if(type.equals("普通客户大批量")){ System.out.println("打九折"); return price*0.9; }else if(type.equals("老客户小批量")){ System.out.println("打八五折"); return price*0.85; }else if(type.equals("老客户大批量")){ System.out.println("打八折"); return price*0.8; } return price; } }
假如,类型特别多,算法比较复杂时,整个条件控制代码会变的很长,难于维护。
策略模式对应于解决某一个问题的算法族,允许用户从该算法族中任选一个算法解决某一问题,
同时可以方便的更换算法或者增加新的算法。并且由客户端决定调用哪个算法。
优点
public interface DiscountStratery { public double getDiscount(double originPrice); } public class VipDicount implements DiscountStratery { public double getDiscount(double originPrice) { // 重写getDiscount()方法,提供VIP打折算法 System.out.println("使用VIP折扣....."); return originPrice * 0.5; } } public class OldDicount implements DiscountStratery { public double getDiscount(double originPrice) { // 重写getDiscount()方法,提供VIP打折算法 System.out.println("使用旧书折扣....."); return originPrice * 0.7; } } public class DiscountContext { // 组合一个DiscountStratery对象 private DiscountStratery strategy; public DiscountContext(DiscountStratery strategy) { this.strategy = strategy; } // 根据实际所使用的DiscountStratery对象得到折扣价 public double getDiscountPrice(double price) { // 如果strategy为 null 系统自动选择OldDicount类 if (strategy == null) { strategy = new OldDicount(); } return this.strategy.getDiscount(price); } // 提供切换算法的方法 public void changeDiscount(DiscountStratery strategy) { this.strategy = strategy; } } public class StrategyClient { public static void main(String[] args) { // 客户端没有选择打折策略类 DiscountContext dc = new DiscountContext(null); double price = 79; // 使用默认的打折策略 System.out.println("79元书的默认打折后的价格是:" + dc.getDiscountPrice(price)); // 客户端选择合适的VIP打折策略 dc.changeDiscount(new VipDicount()); double price2 = 89; System.out.println("89元的书对VIP用户的价格是" + dc.getDiscountPrice(price2)); } }
本质
分离算法,选择实现。
开发中常见的场景:
JAVA设计模式(16):行为型-策略模式(Strategy)
原文地址:http://blog.csdn.net/lovesomnus/article/details/45727479