目的

定义算法框架,并将一些步骤的实现延迟到子类。
通过模板方法,子类可以重新定义算法的某些步骤,而不用改变算法的结构。

类图

模板方法类图.png

实现

冲咖啡和冲茶都有类似的流程,但是某些步骤会有点不一样,要求复用那些相同步骤的代码。
模板方法1.png

  1. public abstract class CaffeineBeverage {
  2. final void prepareRecipe() {
  3. boilWater();
  4. brew();
  5. pourInCup();
  6. addCondiments();
  7. }
  8. abstract void brew();
  9. abstract void addCondiments();
  10. void boilWater() {
  11. System.out.println("boilWater");
  12. }
  13. void pourInCup() {
  14. System.out.println("pourInCup");
  15. }
  16. }
  17. public class Coffee extends CaffeineBeverage {
  18. @Override
  19. void brew() {
  20. System.out.println("Coffee.brew");
  21. }
  22. @Override
  23. void addCondiments() {
  24. System.out.println("Coffee.addCondiments");
  25. }
  26. }
  27. public class Tea extends CaffeineBeverage {
  28. @Override
  29. void brew() {
  30. System.out.println("Tea.brew");
  31. }
  32. @Override
  33. void addCondiments() {
  34. System.out.println("Tea.addCondiments");
  35. }
  36. }
  37. public class Client {
  38. public static void main(String[] args) {
  39. CaffeineBeverage caffeineBeverage = new Coffee();
  40. caffeineBeverage.prepareRecipe();
  41. System.out.println("-----------");
  42. caffeineBeverage = new Tea();
  43. caffeineBeverage.prepareRecipe();
  44. }
  45. }
  46. 运行结果
  47. boilWater
  48. Coffee.brew
  49. pourInCup
  50. Coffee.addCondiments
  51. -----------
  52. boilWater
  53. Tea.brew
  54. pourInCup
  55. Tea.addCondiments

JDK中的体现

  • java.util.Collections#sort()
  • java.io.InputStream#skip()
  • java.io.InputStream#read()
  • java.util.AbstractList#indexOf()