策略模式(strategy)
软件开发中常常遇到这种情况,实现某一个功能有多种算法或者策略,我们可以根据应用场景的不同选择不同的算法或者策略来完成该功能。把一个类(A)中经常改变或者将来可能改变的部分提取出来,作为一个接口(B),然后在类(A)中包含这个接口(B),这样类(A)的实例在运行时就可以随意调用实现了这个接口的类(C)的行为。比如定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换,使得算法可独立于使用它的客户而变化。这就是策略模式
场景:
– 某个市场人员接到单后的报价策略(CRM系统中常见问题)。报价策略
很复杂,可以简单作如下分类:
• 普通客户小批量报价
• 普通客户大批量报价
• 老客户小批量报价
• 老客户大批量报价
– 具体选用哪个报价策略,这需要根据实际情况来确定。这时候,我们
采用策略模式即可。
抽象的策略
package com.xiaoqiang.gof23.actionnModel.strategy;
/**
* @author xiaoqiang
* @date $(DATE)-$(TIME)
*/
public interface Strategy {
public double getPrice(double standerdPrice);
}
少量新用户
package com.xiaoqiang.gof23.actionnModel.strategy;
/**
* @author xiaoqiang
* @date $(DATE)-$(TIME)
*/
public class NewCustomerFewStrategy implements Strategy{
@Override
public double getPrice(double standerdPrice) {
System.out.println("普通用户少量,原价不打折");
return standerdPrice;
}
}
大量新用户
package com.xiaoqiang.gof23.actionnModel.strategy;
/**
* @author xiaoqiang
* @date $(DATE)-$(TIME)
*/
public class NewCustomerManyStrategy implements Strategy{
@Override
public double getPrice(double standerdPrice) {
System.out.println("普通用户大批量,打九折");
return standerdPrice*0.9;
}
}
老用户少量
package com.xiaoqiang.gof23.actionnModel.strategy;
/**
* @author xiaoqiang
* @date $(DATE)-$(TIME)
*/
public class OldCustomerFewStrategy implements Strategy{
@Override
public double getPrice(double standerdPrice) {
System.out.println("老用户少量,不打八五折");
return standerdPrice * 0.85;
}
}
老用户大量
package com.xiaoqiang.gof23.actionnModel.strategy;
/**
* @author xiaoqiang
* @date $(DATE)-$(TIME)
*/
public class OldCustomerManyStrategy implements Strategy{
@Override
public double getPrice(double standerdPrice) {
System.out.println("老用户大批量,打八折");
return standerdPrice*0.8;
}
}
根据策略菜用不同的算法
package com.xiaoqiang.gof23.actionnModel.strategy;
/**
* @author xiaoqiang
* @date $(DATE)-$(TIME)
*/
//与具体的策略类交互,具体的算法与客户端分离,算法可独立的变化
public class Context {
// 当前采用的算法对象
private Strategy strategy;
//通过构造器或set方法来注入 具体的算法类,配置文件动态注入 spring
public Context(Strategy strategy) {
this.strategy = strategy;
}
public void printPrice(double s) {
System.out.println("给你的报价是" + strategy.getPrice(s));
}
}