1、定义
定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用他的客户而变化。
2、示例
报价管理:
向客户报价,对于不同 的客户要报不同的价格,
- 对普通客户或者是新客户报的是全价。
- 对老客户报的价格,根据客户年限,给予一定的的折扣。
- 对大客户报的价格,根据大客户的累计消费额,给予一定的折扣。
- 还要考虑客户购买的数量和金额,比如,虽然是新客户,但是一次购买的数量非常大,或者是总金额非常高,也会有一定的折扣。
- 还有,报价人员的职务高低,也决定了他是否有权限对价格进行一定的浮动折扣。
/**
* 策略,定义计算报价算法的接口
*/
public interface Strategy {
/**
* 计算应报价格
* @param goodsPrice
* @return
*/
public double calcPrice(double goodsPrice);
}
/**
* 具体算法实现,为新客户或普通客户计算应报价格
*/
public class NormalCustomerStrategy implements Strategy {
public double calcPrice(double goodsPrice) {
System.out.println("对于新客服或者是普通客户,没有折扣");
return goodsPrice;
}
}
/**
* 具体算法实现,为老客户计算应报价格
*/
public class OldCustomerStrategy implements Strategy {
public double calcPrice(double goodsPrice) {
System.out.println("对于老客户,统一折扣5%");
return goodsPrice*(1-0.05);
}
}
/**
* 具体算法实现,为大客户计算应报价格
*/
public class LargeCustomerStrategy implements Strategy {
public double calcPrice(double goodsPrice) {
System.out.println("对于大客户,统一折扣10%");
return goodsPrice*(1-0.1);
}
}
/**
* 价格管理,主要完成计算向客户所报价格的功能
*/
public class Price {
private Strategy strategy=null;
public Price(Strategy strategy){
this.strategy=strategy;
}
/**
* 报价计算,对客户报价
* @param goodsPrice
* @return
*/
public double quote(double goodsPrice){
return this.strategy.calcPrice(goodsPrice);
}
}
public class Client {
public static void main(String[] args) {
Strategy strategy=new LargeCustomerStrategy();
Price price=new Price(strategy);
Double normalPrice=1000d;
System.out.println("原价为:"+normalPrice);
double quote=price.quote(normalPrice);
System.out.println("向客户报价:"+quote);
}
}
结果:
原价为:1000.0
对于大客户,统一折扣10%
向客户报价:900.0
3、模式讲解
- 策略模式的功能是把具体的算法实现从具体的业务处理中独立处理,把他们实现成单独的算法类,从而形成一系列的算法,并让这些算法可以相互替换。
策略模式的重心不是如何实现算法,而是如何组织,调用这些算法,从而让程序结构更灵活,具有更好的维护性和扩展性。
- 策略模式和if-else
策略模式就是把各个平等的具体实现封装到单独的策略实现类中,然后通过上下文来与具体的策略类进行交互。
多个if-else 语句可以考虑使用策略模式。
- 算法的平等性
所有算法的地位是完全一样的,在实现上也是相互独立的,相互之间是没有依赖的。
策略算法是相同行为的不同实现。