本文介绍: 1.在父类定义一个操作中的算法骨架,将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤

一、定义
二、使用场景
三、使用方法
四、结构
  • 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("放入菜心");
    }
}
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();
    }
}

六、优点
七、缺点
  • 1.对每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加抽象。
  • 2.父类中的抽象方法由子类实现,子类执行结果影响父类的结果,这导致一种反向的控制结构,它提高了代码阅读的难度.
八、适用场景
  • 1.算法的整体步骤很固定,但其中个别部分易变时,这时候可以使用模板方法模式,将容易变的部分抽象出来,供子类实现。
  • 2.需要通过子类来决定父类算法中某个步骤是否执行,实现子类对父类的反向控制。

原文地址:https://blog.csdn.net/qq_32088869/article/details/130559127

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_3072.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注