【设计模式】模板方法模式

目录

一、定义
  • 1.在父类定义一个操作中的算法骨架,将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤
二、使用场景
  • 1.设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的实现与具体的环境相关
三、使用方法
  • 1.将公共的方法定义在父类中,可以提高代码的复用性
  • 2.不明确的方法在子类中实现,并将方法抽取为父类的抽象方法
四、结构
  • 1.模板方法模式包含的角色:抽象父类、具体子类
  • 2.抽象父类:负责给出一个算法的轮廓和骨架,由一个模板方法和若干个基本方法构成。
  • 3.模板方法:定义了算法的骨架,按某种顺序调用其包含的基本方法。
  • 4.基本方法:是实现算法各个步骤的方法,是模板方法的组成部分。基本方法分为抽象方法、具体方法、钩子方法
  • 5.抽象方法:一个抽象方法由抽象类声明,由具体子类实现
  • 6.具体方法:一个具体方法由抽象类或具体类声明并实现,其子类可以进行覆盖也可以直接继承
  • 7.钩子方法:在抽象类中已经实现,包括用于判断的逻辑方法和需要子类重写的空方法两种。一般钩子方法是用于判断的逻辑方法,这类方法名一般为isXxx,返回值类型为boolean类型
  • 8.具体子类:实现抽象类中定义的抽象方法和钩子方法,它们是一个顶级逻辑的组成步骤
五、代码示例
  • 1.抽象类

    package com.learning.template;

    /**

    • 抽象类
      */
      public abstract class AbstractClass {
      //模板方法定义
      public final void cookProcess(){
      // 倒油
      pourOil();
      // 热油
      heatOil();
      // 倒蔬菜
      pourVegetable();
      // 倒调味品
      pourSauce();
      // 炒
      fry();
      }
      public void pourOil(){
      System.out.println("倒油");
      }
      public void heatOil(){
      System.out.println("热油");
      }
      public abstract void pourVegetable();

      public void pourSauce(){
      System.out.println("撒盐");
      }
      public void fry(){
      System.out.println("翻炒");
      }
      }

  • 2.炒包菜

    package com.learning.template;

    public class Baocai extends AbstractClass{
    @Override
    public void pourVegetable() {
    System.out.println("放入包菜");
    }
    }

  • 3.炒菜心

    package com.learning.template;

    public class Caixin extends AbstractClass{
    @Override
    public void pourVegetable() {
    System.out.println("放入菜心");
    }
    }

  • 4.测试

    package com.learning.template;

    public class Client {
    public static void main(String[] args) {
    Baocai baocai = new Baocai();
    baocai.cookProcess();
    System.out.println("=======");
    Caixin caixin = new Caixin();
    caixin.cookProcess();
    }
    }

  • 5.结果示例

六、优点
  • 1.提高代码复用性,将相同部分的代码放在抽象的父类中,而将不同的代码放入不同的子类中。
  • 2.实现了反向控制,通过一个父类调用其子类的操作,通过对子类的具体实现扩展不同的行为,实现了反向控制 ,并符合"开闭原则"。
七、缺点
  • 1.对每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加抽象。
  • 2.父类中的抽象方法由子类实现,子类执行的结果会影响父类的结果,这导致一种反向的控制结构,它提高了代码阅读的难度.
八、适用场景
  • 1.算法的整体步骤很固定,但其中个别部分易变时,这时候可以使用模板方法模式,将容易变的部分抽象出来,供子类实现。
  • 2.需要通过子类来决定父类算法中某个步骤是否执行,实现子类对父类的反向控制。
相关推荐
小白不太白9502 分钟前
设计模式之 模板方法模式
java·设计模式·模板方法模式
Tech Synapse4 分钟前
Java根据前端返回的字段名进行查询数据的方法
java·开发语言·后端
xoxo-Rachel11 分钟前
(超级详细!!!)解决“com.mysql.jdbc.Driver is deprecated”警告:详解与优化
java·数据库·mysql
乌啼霜满天24912 分钟前
JDBC编程---Java
java·开发语言·sql
色空大师25 分钟前
23种设计模式
java·开发语言·设计模式
闲人一枚(学习中)26 分钟前
设计模式-创建型-建造者模式
java·设计模式·建造者模式
2202_7544215443 分钟前
生成MPSOC以及ZYNQ的启动文件BOOT.BIN的小软件
java·linux·开发语言
蓝染-惣右介1 小时前
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
java·数据库·tomcat·mybatis
小林想被监督学习1 小时前
idea怎么打开两个窗口,运行两个项目
java·ide·intellij-idea