先来假设一种情,我们需要向三种不同的客户做出不同的报价,一般来说要肿么设计呢,是不是马上会想到用IF,没有错,对于这种情况,策略模式是最好的选。大家可以这么理解,如果有情况需要用到大量的IF,那你用策略模式就一定没有错了。好了,不多说,直接上代码
先建一个Customer,放三种不同的客户类型
package Customer; import Inter.Strategy; public class LargeCustomer implements Strategy{ public double calcPrice(double goodsPrice){ System.out.println("对于大客户,统一折扣10%"); return goodsPrice*(1-0.1); } }
package Customer; import Inter.Strategy; public class NormalCustomer implements Strategy{ /** * * 具体算法的实现,为VIP1计算价格 * * */ public double calcPrice(double goodsPrice){ System.out.println("对于新客户或是普通客户,没有折扣"); return goodsPrice; } }
package Customer; import Inter.Strategy; public class oldCustomer implements Strategy{ public double calcPrice(double goodsPrice){ System.out.println("对于老客户,统一折扣5%"); return goodsPrice*(1-0.05); } }
再建一个接口Inter
package Inter; public interface Strategy { /* * * * **/ public double calcPrice(double goodsPrice); }
再来一个实现业务的报价系统
package Price; import Inter.Strategy; public class Price { private Strategy strategy = null; public Price (Strategy aStrategy){ this.strategy = aStrategy; } public double quote(double goodsPrice){ return this.strategy.calcPrice(goodsPrice); } }
是不是很简单,接下来就可以调式了
package Test; import Customer.LargeCustomer; import Inter.Strategy; import Price.Price; public class Clients { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub //实例化并使用LargeCustomer策略装载到策略器strategy当中 Strategy strategy = new LargeCustomer(); //实例化报价者ctx,然后把已经装有策略的策略器strategy给它 Price ctx = new Price(strategy); //正式给报价者ctx输值2000,CTX会跟据已经装有策略的的策略器去执行策略,得出来的值塞给quote,其实不塞进接用该函数也可以显示值,大家懂的 double quote = ctx.quote(2000); System.out.println("向客户报价:" + quote); } }