【设计模式】模板方法模式(Template Method Pattern)

这篇具有很好参考价值的文章主要介绍了【设计模式】模板方法模式(Template Method Pattern)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

23种设计模式之模板方法模式(Template Method Pattern)

基本概念

模板方法模式是一种行为型设计模式,它定义了一个算法骨架,将某些算法步骤的实现延迟到子类中。
这样可以使得算法的框架不被修改,但是具体的实现可以根据需要进行调整。

结构组成

在模板方法模式中,我们通常会定义一个抽象类,它包含了一个模板方法一些抽象方法,这些抽象方法通常由子类来实现

  • 定义抽象类(Abstract Class):抽象类中定义了一些抽象方法和一个模板方法。抽象方法通常是一些具体步骤,而模板方法则定义了算法的大致流程。由于抽象类中的某些方法需要由子类来实现,因此它们往往是 protected 访问权限。
  • 定义具体子类(Concrete Class):具体子类继承自抽象类,并实现其中的抽象方法。在具体子类中,我们可以针对需要实现的具体步骤编写相应的代码。

(1)小栗子

假设我们需要 实现一个炒菜的步骤,炒菜的步骤是固定的,分为倒油、热油、倒蔬菜、倒调料品、翻炒等步骤。现通过模板方法模式来用代码模拟。

抽象类

public abstract class AbstractClass {

    /**
     * 定义唯一一个模板方法,定义了基本方法的执行流程,因为执行流程是固定的不应该被修改,所以使用final修饰
     */
    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 abstract void pourSauce();

    /**
     * 第五步,翻炒
     */
    public void fry() {
        System.out.println("翻炒至熟");
    }
}

具体子类1 炒包菜

/**
 * 炒包菜
 */
public class FryDaBaiCai extends AbstractClass{

    @Override
    public void pourVegetable() {
        System.out.println("放入大白菜");
    }

    @Override
    public void pourSauce() {
        System.out.println("放入辣椒");
    }
}

具体子类2 炒空心菜

/**
 * 炒空心菜
 */
public class FryKxc extends AbstractClass{

    @Override
    public void pourVegetable() {
        System.out.println("放入空心菜");
    }

    @Override
    public void pourSauce() {
        System.out.println("放入大蒜");
    }
}

测试

public class FryTest {
    
    public static void main(String[] args) {
        FryDaBaiCai fryDaBaiCai = new FryDaBaiCai();
        fryDaBaiCai.cookProcess();
        
        FryKxc fryKxc = new FryKxc();
        fryKxc.cookProcess();
    }
}

输出结果:

倒油
热油
放入大白菜
放入辣椒
翻炒至熟
--------------------------------
倒油
热油
放入空心菜
放入大蒜
翻炒至熟    

(2)小栗子

假设我们要实现一个对一个数组进行排序的程序,我们可以定义一个抽象类 ArraySorter,其中包含一个模板方法 sort
这个方法包含以下步骤:检查数组是否为空、确定排序算法、调用具体的排序算法。
我们可以将其中一步 “调用具体的排序算法” 延迟到子类中具体实现。在具体子类中,我们可以实现具体的排序算法,如快排、冒泡排序、插入排序等。

抽象类

public abstract class ArraySorter {

    public final void sort(int[] array) {
        if (array == null || array.length == 0) {
            return;
        }
        selectAlgorithm();
        sortArray(array);
    }

    protected abstract void selectAlgorithm();

    protected abstract void sortArray(int[] array);
}

具体子类1-冒泡排序

public class BubbleSorter extends ArraySorter {
    @Override
    protected void selectAlgorithm() {
        System.out.println("Bubble sorting algorithm selected.");
    }

    @Override
    protected void sortArray(int[] array) {
        // 具体的冒泡排序算法实现
    }
}

具体子类2-快速排序

public class QuickSorter extends ArraySorter {
    @Override
    protected void selectAlgorithm() {
        System.out.println("Quick sorting algorithm selected.");
    }

    @Override
    protected void sortArray(int[] array) {
        // 具体的快排算法实现
    }
}

测试

我们定义了一个抽象类 ArraySorter,其中包含一个模板方法 sort。在具体子类中,我们分别实现了 BubbleSorter 和 QuickSorter,重写了父类的 selectAlgorithm 和 sortArray 方法。
当需要对数组进行排序时,只需要创建一个具体的子类,并调用 sort 方法即可。例如:文章来源地址https://www.toymoban.com/news/detail-654128.html

public class TestSelectSort {
    public static void main(String[] args) {
        int[] array = {1,2,3,4,5,6,7};
        ArraySorter sorter = new BubbleSorter();
        sorter.sort(array);
    }
}

到了这里,关于【设计模式】模板方法模式(Template Method Pattern)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 设计模式第15讲——模板模式(Template)

    模板模式是一种基于 继承 实现的设计模式,它是 行为型 的模式。 主要思想是将定义的算法抽象成一组步骤,在抽象类种定义算法的骨架,把具体的操作留给子类来实现。 通俗地说,模板模式就是将某一行为制定一个框架,然后子类填充细节。比如说做菜,流程通常就是洗

    2024年02月11日
    浏览(32)
  • 设计模式详解(一):工厂方法——Factory Method

    工厂方法是一种创建型设计模式。所谓创建型设计模式是说针对创建对象方面的设计模式。在面向对象的编程语言里,我们通过对象间的相互协作,共同完成复杂的业务逻辑,因而对象之间存在着依赖关系。 当对象A依赖对象B时,我们不采取直接创建对象B的方式,即 B produ

    2024年02月16日
    浏览(33)
  • 工厂方法模式【Factory Method Pattern】

    实例化对象,用工厂方法代替new操作(重点) 工厂模式包括工厂方法模式和抽象工厂模式 抽象工厂模式是工厂方法模式的扩展 有一组类似的 对象需要创建 在编码时 不能预见需要创建哪种类的实例 系统需要考虑 扩展性 ,不应依赖于产品类实例如果被创建、组合和表达的细节

    2024年02月12日
    浏览(26)
  • 设计模式——模板方法模式

    模板方法模式(Template Method Pattern)是一种行为型设计模式,它在抽象类中定义了一个算法的框架,并将一些步骤延迟到子类中实现。这种模式使得子类可以在不改变算法结构的情况下重写算法中的某些特定步骤。 抽象模板类(Abstract Template Class): 定义一个操作中的算法骨架

    2024年01月17日
    浏览(35)
  • 设计模式---模板方法模式

            所谓模板方法模式,就是提供一种方法的模板来实现一种规范,其他人可以利用这个模板定义自己的逻辑。         在Java编程中的应用,主要就是通过接口或者抽象类来实现的,抽象类中可以把逻辑函数声明为final类型,表示不能被重写,即不能改变逻辑。在接口中

    2024年04月24日
    浏览(36)
  • 设计模式—模板方法模式

    定义一个操作的流程框架,而将流程中一些步骤延迟到子类中实现。使得子类在不改变流程结构的情况下,重新定义流程中的特定步骤。 主要角色: 抽象类: 负责给出操作流程的轮廓或框架,由模板方法和若干基本方法组成。   1、抽象方法:由抽象类声明,在具体子类中实

    2024年02月10日
    浏览(37)
  • 【设计模式】模板方法模式

    模板方法模式:定义一个操作中的算法骨架(父类),而将一些步骤延迟到子类中。 模板方法使得子类可以不改变一个算法的结构来重定义该算法的 实现一些操作时,整体步骤很固定,但是呢。就是其中一小部分需要改变,这时候可以使用模板方法模式,将容易变的部分抽

    2024年02月08日
    浏览(34)
  • 设计模式(13):模板方法模式

    实现一个功能时,整体步骤很固定,但是,某些部分易变。易变部分可以抽象出来,供子类实现。 非常繁琐,各个框架,类库中都有它的影子,比如常见的有: 数据库访问的封装 Junit单元测试 servlet中关于doGet/doPost方法调用 spring框架中各种Template shire中权限认证和授权都用到

    2024年04月16日
    浏览(33)
  • 设计模式(7)模板方法模式

    一、定义: 定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。它是一种类行为型模式。

    2024年02月12日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包