具体选用哪个报价策略,这需要根据实际情况来确定。这时候,我们采用策略模式即可。
我们先采用条件语句处理
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