模板方法模式-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; } }