模板方法模式-java实战

经典实现

模板方法模式(Template Method Pattern)是一种行为型设计模式,它在父类中定义了一个算法的框架,允许子类在不改变算法结构的情况下重新定义算法的某些特定步骤。

  • 实现步骤:

    • 定义抽象类:这个类定义了算法的框架,包括模板方法和一些抽象方法。

      • 实现模板方法:模板方法定义了算法的骨架,它调用抽象方法,调用具体方法。

      • 定义抽象方法:这些方法由子类实现,它们代表了算法的某些步骤。

      • 定义钩子方法:一个空方法,子类可以通过这个钩子,控制父类执行逻辑

    • 实现具体子类:子类实现抽象类中的抽象方法、钩子方法,从而完成算法的特定步骤。

  • 代码示例(Java):

     // 抽象类
    public abstract class Coffee {
         // 模板方法
         public final void prepareRecipe() {
             //煮水
             boilWater();
             //酿造
             brew();
             //倒入杯中
             pourInCup();
             //加入调味品
             if(needCondiments()){
               addCondiments();
             }
         }
    
         // 抽象方法,由子类实现
         abstract void brew();
    
         // 抽象方法,由子类实现
         abstract void addCondiments();
    
         //钩子方法
         boolean needCondiments(){
           return false;
         }
       
         // 具体方法
         void boilWater() {
             System.out.println("Boiling water");
         }
    
         void pourInCup() {
             System.out.println("Pouring into cup");
         }
     }
    
     // 具体实现子类
    public class CoffeeWithNothing extends Coffee {
         @Override
         void brew() {
             System.out.println("Steeping tea");
         }
    
         @Override
         void addCondiments() {
         }
     }
    
    public class CoffeeWithMilk extends Coffee {
         @Override
         void brew() {
             System.out.println("Dripping coffee through filter");
         }
    
         @Override
         void addCondiments() {
             System.out.println("Adding sugar and milk");
         }
         
         @Override
         boolean needCondiments(){
           return true;
         }
     }
    
     // 客户端代码
     public class Main {
         public static void main(String[] args) {
             Coffee tea = new Tea();
             tea.prepareRecipe();
    
             Coffee coffee = new CoffeeWithMilk();
             coffee.prepareRecipe();
         }
     }
    
    

Spring框架实现

是模板方法模式和回调模式的结合,不需要继承的另一种实现方式。

  • 实现步骤:

    • 实现模板方法:定义算法的骨架,它调用回调方法

    • 定义回调接口:定义回调方法。

    • 实现回调接口的具体类:实现回调方法,控制具体执行逻辑。

  • 代码示例(Java):

    阅读源码JdbcTemplate、RedisTemplate等源码中的execute方法。

    //模板方法所属类
    public class Coffee {
    
      public <T> T process(CondimentsCallback<T> condimentsCallback){
          //煮水
          boilWater();
          //酿造
          brew();
          //倒入杯中
          pourInCup();
    
          return condimentsCallback.addCondiments();
      }
    
      // 具体方法
      void boilWater() {
          System.out.println("Boiling water");
      }
    
      void brew() {
          System.out.println("Steeping tea");
      }
    
      void pourInCup() {
          System.out.println("Pouring into cup");
      }
      
      //示例调用方法
      public void processWithNothing(){
          process(new CoffeeWithNothing());
      }
    
      public int processWithMilk(){
          return process(new CoffeeWithMilk());
      }
    
    }
    
    //回调接口
    public interface CondimentsCallback <T>{
      T addCondiments();
    }
    
    //具体实现
    public class CoffeeWithNothing implements CondimentsCallback<Object> {
      @Override
      public Object addCondiments() {
          System.out.println("Nothing Adding");
          return null;
      }
    }
    
    public class CoffeeWithMilk implements CondimentsCallback<Integer>{
      @Override
      public Integer addCondiments() {
          System.out.println("Adding sugar and milk");
          return 0;
      }
    }
    
posted @ 2024-11-20 18:41  抒写  阅读(17)  评论(0编辑  收藏  举报