策略模式
一、概述
- 策略模式对应于解决某一个问题的一个算法族,允许用户从该算法族 中任选一个算法解决某一问题,同时可以方便的更换算法或者增加新 的算法。并且由客户端决定调用哪个算法。
- 本质:分离算法,选择实现。
- 应用场景:某个市场人员接到单后的报价策略(CRM系统中常见问题)。报价策略 很复杂,可以简单作如下分类:
- 普通客户小批量报价
- 普通客户大批量报价
- 老客户小批量报价
- 老客户大批量报价
具体选用哪个报价策略,这需要根据实际情况来确定。这时候,我们 采用策略模式即可。
- 如果用条件语句处理
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 Strategy { public double getPrice(double standardPrice); } --------------------------------------------------------- public class NewCustomerFewStrategy implements Strategy { @Override public double getPrice(double standardPrice) { System.out.println("不打折,原价"); return standardPrice; } } --------------------------------------------------------- public class NewCustomerManyStrategy implements Strategy { @Override public double getPrice(double standardPrice) { System.out.println("打九折"); return standardPrice*0.9; } } --------------------------------------------------------- public class OldCustomerFewStrategy implements Strategy { @Override public double getPrice(double standardPrice) { System.out.println("打八五折"); return standardPrice*0.85; } } --------------------------------------------------------- public class OldCustomerManyStrategy implements Strategy { @Override public double getPrice(double standardPrice) { System.out.println("打八折"); return standardPrice*0.8; } }
-
和具体的策略类交互的上下文类
/** * 负责和具体的策略类交互 * 这样的话,具体的算法和直接的客户端调用分离了, * 使得算法可以独立于客户端独立的变化。 * 如果使用spring的依赖注入功能,还可以通过配置文件, * 动态的注入不同策略对象,动态的切换不同的算法. * */ public class Context { private Strategy strategy; //当前采用的算法对象 //可以通过构造器来注入 public Context(Strategy strategy) { super(); this.strategy = strategy; } //可以通过set方法来注入 public void setStrategy(Strategy strategy) { this.strategy = strategy; } public void pringPrice(double s){ System.out.println("您该报价:"+strategy.getPrice(s)); } }
-
客户类
public class Client { public static void main(String[] args) { Strategy s1 = new OldCustomerManyStrategy(); Context ctx = new Context(s1); ctx.pringPrice(998); } }