当前位置: 首页 > article >正文

模板方法设计模式

阅读本文之前,请投票支持这款 全新设计的脚手架 ,让 Java 再次伟大!

模板方法设计模式怎么用?

试想一个业务场景。项目产生了一个代码排序后打印的需求。此需求被交付给了程序员 A 来实现。A 通过分析需求后发现要解决此问题需要 2 个步骤.

  1. 排序数组
  2. 打印排序后的数组

打印好做,而排序方法和规则较多,就比较麻烦了。于是 A 想到了一个办法,先把打印部分的代码做好,其他的交由其他程序员实现。

/**
 * 模板方法设计模式
 * 抽象类
 */
public abstract class AbstractSort {


    /**
     * 将数组由大到小排序.
     *
     * @param array
     */
    protected abstract void sort(int[] array);


    /**
     * 打印排序好的数组.
     *
     * @param array
     */
    public final void showSortResult(int[] array) {

        this.sort(array);
        System.out.print("排序结果:");
        for (int i = 0; i < array.length; i++) {
            System.out.printf("%3s", array[i]);
        }

    }

}

现在,A 已经做好了该需求主要框架部分的代码了。于是 A 通知到程序员 B,希望由 B 来负责实现剩下的逻辑。

/**
 * 模板方法设计模式
 * 排序具体实现类
 */
public class ConcreteSort extends AbstractSort {

    /**
     * 排序方法
     * 排序数组里每个元素的值.
     *
     * @param array 数组
     */
    @Override
    protected void sort(int[] array) {
        for (int i = 0; i < array.length - 1; i++) {
            selectSort(array, i);
        }
    }

    /**
     * 排序具体算法实现
     * 遍历每个元素,找出相对于当前最小的元素的索引,然后调换互相的位置
     *
     * @param array 数组
     * @param index 索引
     */
    private void selectSort(int[] array, int index) {

        int MinValue = 32767; // 最小值变量
        int indexMin = 0; // 最小值索引变量
        int Temp; // 暂存变量
        for (int i = index; i < array.length; i++) {
            if (array[i] < MinValue) { // 找到最小值
                MinValue = array[i]; // 储存最小值
                indexMin = i;
            }
        }
        Temp = array[index]; // 交换两数值
        array[index] = array[indexMin];
        array[indexMin] = Temp;

    }

}

程序员 B 实现了小->大的排序逻辑,通知到 A 进行测试。


/**
 * 模板方法设计模式
 * 排序测试
 */
public class Client {
    public static int[] a = {10, 32, 1}; // 预设数据数组

    public static void main(String[] args) {
        AbstractSort s = new ConcreteSort();
        s.showSortResult(a);
    }
}

排序结果: 1,10,32
这就是模板方法模式的主要用法。是不是很好理解?认识了模板方法的用法以后,再认识一下模板方法模式的结构,从理论上巩固一下该章节的知识。

模板方法模式主要包含下面 3 个方法。

  • 模板方法
  • 抽象方法
  • 钩子方法

模板方法
父类中只声明但不加以实现,而是定义好规范,然后由它的子类去实现。

抽象方法
由抽象类声明并加以实现。一般来说,模版方法调用抽象方法来完成主要的逻辑功能,并且,模版方法大多会定义为 final 类型,指明主要的逻辑功能在子类中不能被重写。

钩子方法
由抽象类声明并加以实现。但是子类可以去扩展,子类可以通过扩展钩子方法来影响模版方法的逻辑。
抽象类的任务是搭建逻辑的框架,通常由经验丰富的人员编写,因为抽象类的好坏直接决定了程序是否稳定性。实现类用来实现细节。抽象类中的模版方法正是通过实现类扩展的方法来完成业务逻辑。只要实现类中的扩展方法通过了单元测试,在模版方法正确的前提下,整体功能一般不会出现大的错误。

总结

  1. 模板方法模式在项目中会经常运用到,需要熟练掌握。
  2. 模板方法模式结构清晰。一般在项目中常常将不易于变化的部分封装为模板方法。而将易于变化的部分定义为抽象方法。
  3. 模板方法模式易于扩展。面对新增需求,只需要增加相应的模板抽象方法实现子类就可以了,符合了接口的开闭原则。
  4. 在多个子类拥有相同的方法,并且这些方法逻辑相同时,可以考虑使用模版方法模式。在程序的主框架相同,细节不同的场合下,也比较适合使用这种模式。

http://www.kler.cn/news/354992.html

相关文章:

  • hdfs API操作 hadoop3.3.5
  • java项目技术架构图-样例
  • mysql--表的约束
  • 【Ubuntu】虚拟机共享文件夹启用
  • NFTScan | 10.07~10.13 NFT 市场热点汇总
  • vmware ubuntu根分区扩容
  • 纯前端如何实现批量下载功能呢?
  • ChatGPT免费使用:人工智能在现代社会中的作用
  • Day31 || 122.买卖股票的最佳时机 II、55. 跳跃游戏、 45.跳跃游戏II 、1005.K次取反后最大化的数组和
  • LangGraph - Hierarchical Agent Teams
  • 京东背调有病吧......
  • 开源节流-2024年10月17日
  • 【秋招笔试】10.13拼多多(已改编)秋招-三语言题解
  • LLM大模型的评测维度有哪些?
  • 试用cursor的简单的记录
  • mysql迁移到达梦的修改点
  • 企业电子印章主要通过以下几种方式进行防伪
  • DIFY上使用多种大语言模型(MindCraft API)
  • AI绘图大模型 Stable Diffusion 使用详解
  • 利用高德API获取整个城市的公交路线并可视化(六)