策略模式

74 阅读1分钟

策略模式

定义:用于封装系列的算法,这些算法通常被封装在一个被称为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,待续。