描述

在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。

image.png

主要角色

模板方法(Template Method)包含两个角色

  • 抽象类/抽象模板(Abstract Class)
  • 具体子类/具体实现(Concrete Class)

代码实现

  1. /**
  2. * @author:lshady 定义规则
  3. * @DATA:2021-09-07 01:00:30
  4. */
  5. public abstract class CookTemplate {
  6. public void stirFryRule(){
  7. addWater();
  8. openFire();
  9. addSeasoning();
  10. getUp();
  11. }
  12. //加水
  13. public void addWater(){
  14. System.out.println("加水中");
  15. }
  16. //开火
  17. public void openFire(){
  18. System.out.println("开火!!!");
  19. }
  20. //加调料
  21. public abstract void addSeasoning();
  22. //起锅
  23. public void getUp(){
  24. System.out.println("起锅");
  25. }
  26. }
  1. public class Barbecue extends CookTemplate{
  2. @Override
  3. public void addSeasoning() {
  4. System.out.println("烧烤加孜然调料");
  5. }
  6. }
  1. public class Drumstick extends CookTemplate{
  2. @Override
  3. public void addSeasoning() {
  4. System.out.println("鸡腿加辣椒");
  5. }
  6. }
  1. public class Test {
  2. public static void main(String[] args) {
  3. CookTemplate drumstick = new Drumstick();
  4. drumstick.stirFryRule();
  5. System.out.println("================>");
  6. CookTemplate barbecue = new Barbecue();
  7. barbecue.stirFryRule();
  8. }
  9. }
  10. //测试结果
  11. 加水中
  12. 开火!!!
  13. 鸡腿加辣椒
  14. 起锅
  15. ================>
  16. 加水中
  17. 开火!!!
  18. 烧烤加孜然调料
  19. 起锅

使用场景

什么场景用到?

  • Spring的整个继承体系都基本用到模板方法;
    • BeanFactory.getBean(1,2,3,4)—A1—-A2—-A3—-A4(全部被完成)
  • JdbcTemplate、RedisTemplate都允许我们再扩展…..
  • 我们自己的系统也应该使用模板方法组织类结构 ……