场景
某个市场人员接到单后的报价策略(CRM系统中常见问题)报价策略很复杂,可以简单做如下分类:
- 普通客户小批量报价
- 普通客户大批量报价
- 老客户小批量报价
- 老客户大批量报价
具体选用哪个报价策略,这需要根据实际情况来确定。这时候,我们采用策略模式即可。
我们先采用条件语句处理
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; } }
假如,类型特别多,算法比较复杂时,整个条件控制代码会变的很长,难于维护。
策略模式对应于解决某一个问题的算法族,允许用户从该算法族中任选一个算法解决某一问题,
同时可以方便的更换算法或者增加新的算法。并且由客户端决定调用哪个算法。
优点
- 可以动态的改变对象的行为
缺点
- 客户端必须知道所有的策略类,并自行决定使用哪一个策略类
- 策略模式将造成产生很多策略类
组成
- 环境类(Context):用一个ConcreteStrategy对象来配置。维护一个对Strategy对象的引用。可定义一个接口来让Strategy访问它的数据。
- 抽象策略类(Strategy):定义所有支持的算法的公共接口。 Context使用这个接口来调用某ConcreteStrategy定义的算法。
- 具体策略类(ConcreteStrategy):以Strategy接口实现某具体算法。
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中GUI编程中,布局管理
- Spring框架中,Resource接口,资源访问策略
- java.servlet.http.HttpServlet#service()
时间: 2024-12-25 18:19:40