经典实现
模板方法模式(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 {@Overridevoid brew() {System.out.println("Steeping tea");}@Overridevoid addCondiments() {}}public class CoffeeWithMilk extends Coffee {@Overridevoid brew() {System.out.println("Dripping coffee through filter");}@Overridevoid addCondiments() {System.out.println("Adding sugar and milk");}@Overrideboolean 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> {@Overridepublic Object addCondiments() {System.out.println("Nothing Adding");return null;} }public class CoffeeWithMilk implements CondimentsCallback<Integer>{@Overridepublic Integer addCondiments() {System.out.println("Adding sugar and milk");return 0;} }