设计模式之策略模式 Strategy
代码实现
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的依赖注入功能,可以通过配置文件,动态的注入不同的策略对象,动态的切换不同的算法 * @author bzhx * 2017年3月15日 */ 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 printPrice(double s){ System.out.println("您的报价是:"+strategy.getPrice(s)); } }
public class TestStrategy { /** * 实现起来容易, * 但是类型比较多,逻辑比较复杂的时候,代码变得比较复杂,难以维护 * 如果有新增类型,就需要频繁的修改此处代码 * 不符合 开闭原则 * @param type * @param price * @return */ 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 class Client { public static void main(String[] args) { Strategy s1 = new OldCustomerManyStrategy(); Context ctx = new Context(s1); ctx.printPrice(100); } }