一、 应用场景
商场对于不同的客户采用不同的打折策略;
施工对于不同的地形地貌采用不同的施工方法;数据处理针对不同批量的数据选取不同的算法等。
对于常用的
if() {
}else if(){
}else if(){
}else{}
结构,可以采用策略模式来重构。 当增加新的模式时,不需要修改原有的代码,符合开闭原则。
它可以算法与架构分离。
二、具体实现
- 实现要点
1. 一个Strategy interface, 在其中定义要实现的方法。
2. 多个具体的Strategy类,implements interface, 在其中实现不同的算法。
3.一个上下文类 Context, 其中包含Strategy 对象,可以选择不同的具体策略类来处理业务。
- 代码实现
以超市打折策略为例,新客户买的少不打折;新客户买的多打9折;老客户买的少打9折;老客户买的多打8折。
1. Strategy接口,规定要实现的方法。
public interface Strategy {
double getPrice(double originalPrice);
}
2. 不同的策略, implements interface
public class NewCustomerFew implements Strategy {
@Override
public double getPrice(double originalPrice) {
System.out.println("新客户买的少不打折!");
return originalPrice;
}
}
class NewCustomerMany implements Strategy {
@Override
public double getPrice(double originalPrice) {
System.out.println("新客户买的多打九折!");
return originalPrice * 0.9;
}
}
class OldCustomerFew implements Strategy {
@Override
public double getPrice(double originalPrice) {
System.out.println("老客户买的少打九折!");
return originalPrice * 0.9;
}
}
class OldCustomerMany implements Strategy {
@Override
public double getPrice(double originalPrice) {
System.out.println("老客户买的多打八折!");
return originalPrice * 0.8;
}
}
3. 上下文类,包含有策略的对象。
public class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public double getPrice(double originalPrice){
return this.strategy.getPrice(originalPrice);
}
}
测试类
public class ClientTest {
public static void main(String[] args) {
Context context = new Context(new NewCustomerFew()); //新客户买的少
System.out.println(context.getPrice(100));
context.setStrategy(new OldCustomerMany()); //老客户买的多
System.out.println(context.getPrice(999));
}
}
测试结果