策略模式
定义:用于封装系列的算法,这些算法通常被封装在一个被称为Context的类中,客户端程序可以自由选择其中一种算法,或让Context为客户端选择一个最佳的算法。
场景:假如正在开发一个网上书店,该书店为了更好的促销,经常需要对图书进行打折,程序需要考虑各种打折促销的计算方法。
不使用策略模式,可以这样实现。
public double discount(double price){
switch(getDiscountType){
case VIP_DISCOUNT:
return vipDiscount(price);
break;
case OLD_DISCOUNT:
return oldDiscount(price);
breack;
case SALE_DISCOUNT:
return saleDiscount(price);
break;
}
}
问题:新增一种打折,那么需要改动三处代码,代码维护和扩展不方便。
应用场景:Spring的Resource接口。Hibernate的Dialect方言都有所体现。
策略模式结构图:

// 接口算法类
public interface Strategy{
// 算法方法
public void AlgorithmInterface();
}
//具体算法A
public class ConcreteStragetyA implements Strategy{
@Override
public void AlgorithmInterface(){
System.out.println("算法A的实现");
}
}
//具体算法B
public class ConcreteStragetyA implements Strategy{
@Override
public void AlgorithmInterface(){
System.out.println("算法B的实现");
}
}
//具体算法C
public class ConcreteStragetyA implements Strategy{
@Override
public void AlgorithmInterface(){
System.out.println("算法C的实现");
}
}
//Context,用一个ConcreteStrategy来配置,维护一个对Strategy对象的引用
public class Context{
private Strategy strategy;
// 初始化时,传入具体的策略对象
public Context(Strategy strategy){
this.strategy = strategy;
}
// 根据传入的策略对象,调用其算法的方法
public void ContextInterface(){
this.strategy.AlgorithmInterface();
}
}
//客户端代码
public class StrategyTest{
public static void main(String[] args) {
Context context = null;
context = new Context(new ConcreteStrategyA());
context.ContextInterface();
Context context = null;
context = new Context(new ConcreteStrategyB());
context.ContextInterface();
}
}
源码参考:github,待续。