如下使用场景:
- 某个市场人员接到单后的报价策略(CRM系统中常见问题)。报价策略很复杂,可以简单作如下分类:
- 1),普通客户小批量报价
- 2),普通用户大批量报价
- 3),老客户小批量报价
- 4),老客户大批量报价
要实现以上的报价系统,一般程序员都会想到这样来做,如下
/**未使用策略模式
* @author 晓电脑
* 缺点: 违反了java的开闭原则
* 如果需要修改打折方法都需要修改getPrice()方法 后期难于维护
*/
public class NoStrategyTest {
public static void main (String[] args) {
String user="老客户小批量";
NoStrategyTest strategyTest = new NoStrategyTest();
double price = strategyTest.getPrice(user, 500);
System.out.println(price);
}
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.95;
}else if (type.equals("老客户大批量")){
System.out.println("打八五折");
return price*0.85;
}
return price;
}
}
策略模式:
- 策略模式对应于解决,某一个问题的一个算法族,允许用户从该算法族中任选一个算法解决某一个问题 , 同时可以方便的更换算法或者增加新的算法 。并且客户端决定调用哪个算法。
1),创建算法抽象类接口
/**价格接口类
* @author 晓电脑
*/
public interface Strategy {
double getPrice(double price);
}
2),创建新客户小批量类继承与价格接口类
/** 新客户小批量
* @author 晓电脑
*/
public class NewCoustomerSmallStrategy implements Strategy{
@Override
public double getPrice(double price) {
System.out.println("不打折");
return price;
}
}
3),创建新客户大批量客户类,继承与价格类接口
/** 新客户大批量
* @author 晓电脑
*/
public class NewCoustomerManyStrategy implements Strategy{
@Override
public double getPrice(double price) {
System.out.println("打九折");
return price*0.9;
}
}
4),创建老客户小批量价格类 ,继承与价格类
/** 老客户小批量
* @author 晓电脑
*/
public class OldCoustomerSmallStrategy implements Strategy{
@Override
public double getPrice(double price) {
System.out.println("打九五折");
return price*0.95;
}
}
5),创建老客户大批量价格处理类 , 继承与价格类
/** 老客户小批量
* @author 晓电脑
*/
public class OldCoustomerManyStrategy implements Strategy{
@Override
public double getPrice(double price) {
System.out.println("打八五折");
return price*0.85;
}
}
6),创建与策略类交互的类Context
/**负责和具体策略类交互的类
* @author 晓电脑
*/
public class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public double printPrice(double price){
/**
* 调用接口实现类的方法
*/
return strategy.getPrice(price);
}
}
7),创建客户端进行测试
/**测试策略模式
* @author 晓电脑
*/
public class Client {
public static void main (String[] args) {
//创建老客户大批量的类进行处理价格
OldCoustomerManyStrategy manyStrategy = new OldCoustomerManyStrategy();
//传入老客户大批量类
Context context = new Context(manyStrategy);
//的到打折后的价格
double printPrice = context.printPrice(5000);
System.out.println(printPrice);
}
}
运行结果
策略模式本质是: 分离算法 , 选择实现
开发中常见的场景:
- JavaSE中GUI编程中 ,布局管理
- Spring框架中 ,Resource接口,资源访问策略