报价场景:
客户买公司产品,市场部同事如何报价?假设产品定价998元每个。
如果是老客户大批量购买,定价85折
如果是老客户小批量购买,定价95折
如果是新客户大批量购买,定价9折
如果是新客户小批量购买,定价原价
一般程序员的思路
double getPrice(String type,double p){
if(type是老客户大批量){
return p* 0.85;
}
if(type是老客户小批量){
return p* 0.95;
}
if(type是新客户大批量){
return p* 0.9;
}
if(type是新客户小批量){
return p;
}
}
增加一种新的情况,信用低客户小,大批量,不卖…需要加代码,违背了开闭原则,对于新功能,只扩展,不修改的原则。
策略模式
分离算法,选择实现。
策略接口,其中定义方法获取报价。
对于每一种算法,实现策略接口,报价方法具体不同。
上下文Context维护策略引用,调用者设置不同策略,后期可以通过反射写进配置文件里面,调用不同策略。
如果新增信用低客户小,大批量,不卖策略,增加实现策略接口的实现类两个。不用修改代码。
算法(解决问题的有限的,确定的,唯一的,正确的步骤集合)策略接口
package com.bjsxt.strategy;
public interface Strategy {
double getPrice(double p);
}
算法1:
package com.bjsxt.strategy;
public class OldCustomerManyStrategy implements Strategy {
@Override
public double getPrice(double p) {
System.out.println("老客户大批量-85折");
return p*0.85;
}
}
算法2:
package com.bjsxt.strategy;
public class OldCustomerFewStrategy implements Strategy {
@Override
public double getPrice(double p) {
System.out.println("老客户小批量-95折");return p*0.95;
}
}
算法3:
package com.bjsxt.strategy;
public class NewCustomerManyStrategy implements Strategy {
@Override
public double getPrice(double p) {
System.out.println("新客户大批量-9折");return p*0.9;
}
}
算法4:
package com.bjsxt.strategy;
public class NewCustomerFewStrategy implements Strategy {
@Override
public double getPrice(double p) {
System.out.println("新客户小批量-原价");return p;
}
}
上下文,维护策略接口引用
package com.bjsxt.strategy;
public class Context {
Strategy strategy;
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public Context(Strategy strategy) {
this.strategy = strategy;
}
public double getPrice(double p){
System.out.println("原价:"+p);
return strategy.getPrice(p);
}
}
调用者
package com.bjsxt.strategy;
public class Client {
public static void main(String[] args) {
Context c = new Context(new OldCustomerManyStrategy());
System.out.println("报价"+c.getPrice(899));
Context c2 = new Context(new OldCustomerFewStrategy());
System.out.println("报价"+c2.getPrice(899));
}
}
uml图
运行结果:
策略模式
– 策略模式对应于解决某一个问题的一个算法族,允许用户从该算法族 中任选一个算法解决某一问题,同时可以方便的更换算法或者增加新 的算法。并且由客户端决定调用哪个算法。
本质:
– 分离算法,选择实现。
• 开发中常见的场景:
– JAVASE中GUI编程中,布局管理
– Spring框架中,Resource接口,资源访问策略
– javax.servlet.http.HttpServlet#service()