模板方法设计模式的学习和使用

news2024/11/26 10:48:44

1、模板方法设计模式的学习

  当涉及到一系列具有相似行为的算法或操作时,模板方法设计模式是一种有效的设计模式。它允许你定义一个算法的骨架,同时将某些步骤的实现细节交给子类来实现。
  模板方法模式基于以下两个核心原则:

  1. 抽象类定义模板方法骨架:抽象类中定义一个模板方法,该方法确定了算法的骨架结构,包含一系列的步骤,其中某些步骤可以是具体实现,某些步骤可以是抽象方法,由子类实现。这个模板方法定义了算法的顺序和结构,但具体的实现可以在子类中有所不同。
  2. 具体子类实现细节:具体的子类继承抽象类并实现其中的抽象方法,以提供对应算法步骤的具体实现。每个子类都可以根据自身的特定需求来实现这些抽象方法,从而定制化算法的行为。
    在这里插入图片描述

2、模板方法设计模式的使用

  实现一个数据导入工具,支持从不同数据源(例如数据库、Excel、CSV文件)导入数据,并提供一致的导入过程和结果输出。
实现:
1、定义一个抽象类 DataImporter,作为数据导入工具的模板类。
2、在 DataImporter 中定义一个模板方法 importData(),用于规定导入数据的流程。
3、在 DataImporter 中定义若干抽象方法,例如 extractData() 用于从数据源提取数据,transformData() 用于数据转换,loadData() 用于数据加载等。
4、创建具体的数据导入类,继承 DataImporter 并实现其中的抽象方法,以支持从不同的数据源导入数据。
5、在 importData() 方法中按照事先定义的流程依次调用抽象方法,完成数据导入的过程。
数据导入工具的模板类

public abstract class DataImporter {

    /**
     * 规定导入数据的流程
     */
    protected void importData() {
        this.loadData(this.transformData(this.extractData()));
    }

    /**
     * 从数据源提取数据
     *
     * @return
     */
    protected abstract Object extractData();

    /**
     * 数据转换
     *
     * @param data
     * @return
     */
    protected abstract String transformData(Object data);

    /**
     * 数据加载
     *
     * @param data
     */
    private void loadData(String data) {
        System.out.println("数据加载:" + data);
    }
}

数据库数据导入

public class DataBaseDataImporter extends DataImporter {
    @Override
    protected Object extractData() {
        return "数据库的数据";
    }

    @Override
    protected String transformData(Object data) {
        return "这是" + data;
    }
}

excel数据导入

public class ExcelDataImporter extends DataImporter {
    @Override
    protected Object extractData() {
        return "excel的数据";
    }

    @Override
    protected String transformData(Object data) {
        return "这些是" + data;
    }
}

CSV文件的数据

public class CsvDataImporter extends DataImporter {
    @Override
    protected Object extractData() {
        return "CSV文件的数据";
    }

    @Override
    protected String transformData(Object data) {
        return "这些都是" + data;
    }
}

模板设计模式客户端

public class TemplateClient {
    public static void main(String[] args) {
        ExcelDataImporter excelDataImporter = new ExcelDataImporter();
        excelDataImporter.importData();

        CsvDataImporter csvDataImporter = new CsvDataImporter();
        csvDataImporter.importData();

        DataBaseDataImporter dataBaseDataImporter = new DataBaseDataImporter();
        dataBaseDataImporter.importData();
    }
}
数据加载:这些是excel的数据
数据加载:这些都是CSV文件的数据
数据加载:这是数据库的数据

3、总结

  模板方法设计模式的优势在于提供了一种代码复用的方式,可以避免在每个子类中重复编写相同的代码,同时允许子类在需要的地方提供自定义的实现。这样,模板方法模式实现了算法的核心部分集中管理,同时保留了灵活性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/621486.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python将一张图片分割成多张:从理论到实践

Python将一张图片分割成多张:从理论到实践 简介 随着Internet的爆炸式增长,图片已经成为了我们生活中不可或缺的一部分。具有高质量、高清晰度的图片可以提升网站的美观程度,帮助网站吸引更多的用户。但是,有时候大型的图片并不…

chatgpt赋能python:Python并不是一门简单的编程语言

Python 并不是一门简单的编程语言 Python 是一门直观且易学的编程语言,这一点没有错,但是要说它是简单的,那其实是不准确的。Python 有着广泛的应用领域,包括人工智能、大数据分析、Web开发、自动化测试等。尽管初学者可以迅速上…

MySQL中BETWEEN AND(范围查询)

0 写在前面 MySQL 提供了 BETWEEN AND 关键字,用来判断字段的数值是否在指定范围内。 BETWEEN AND 需要两个参数,即范围的起始值和终止值。如果字段值在指定的范围内,则这些记录被返回。如果不在指定范围内,则不会被返回。 最近…

JS 装饰器

JS 装饰器 JavaScript 装饰器是一种以 符号开头的特殊语法,放在目标代码的前面用于包装或扩展代码功能。JavaScript 的装饰器语法目前仍处于提案阶段,现阶段使用的话需要通过 bable 等方式进行编译之后,才能在浏览器正常运行。装饰器分为两…

chatgpt赋能python:Python将空值替换成0

Python 将空值替换成 0 在数据分析和处理过程中,清洗数据往往是非常重要的一个环节。而在清洗数据过程中,经常会遇到空值(Missing Values)的问题。空值是指在数据集中出现的缺失值,它可能是由于数据输入错误、数据采集…

chatgpt赋能python:Python定义数据框:介绍和基础操作

Python定义数据框:介绍和基础操作 数据框是一种非常方便的数据结构,用于在Python中存储和处理表格数据。数据框可以看作是围绕Series对象构建的2D数据结构,Series是一种存储单个列的一维标记数组。在本文中,我们将介绍如何使用Py…

基于树莓派4B的车牌号识别

目录 0. 前言1. Raspbian系统烧录2. 更换清华源1. 查看树莓派系统版本2. 更换清华国内源3. Raspi镜像修改4. 系统源更新5. 错误排查 3. opencv安装4. 安装 hyperlprpip安装编译安装 5. 验证项目可行性 0. 前言 基于树莓派4B的车牌号识别系统 操作系统:Raspbian PC…

QT实例2(QTableWidget表格中增删数据)

案例介绍 本案例仅简单介绍QTableWidget部分使用方法,如在表格中插入或删除一行数据以及清空表格数据等。在添加数据时,设置了条件判断如正则表达式,若用户输入的数据不合法,则添加失败并提示用户错误的地方,便于用户…

IPsec的NAT穿越详解

问题场景 左边的支部,它的防火墙上联路由器,由于防火墙内部的接口使用的是私网地址,这就导致其无无法在公网上与对端防火墙进行IPsec的隧道建立 。所以必须在AR5上面不是NAT地址转换,由于一般使用的是NAPT,isakmp协议因…

ChatGPT评测

总结:ChatGPT很强大,用作学术方面的问答或者软件行业的辅助工具是有一定的作用,但是有些回答设置了限制,并且中文回答方面总是回答一半,需要一直让他继续说,篇幅不是很长,但是往往能说道精髓&am…

最新加装ChatGPT的New Bing申请流程(含出错解决办法)

两天获得New Bing测试资格流程记录 前言一、Microsoft Edge Dev浏览器下载二、Microsoft账号注册与登陆三、浏览器插件下载与添加四、加入候补名单五、写封信给Bing团队 前言 2023.03.08,下午收到了Microsoft Bing公司的邮件,提示测试资格申请成功&…

Qt Xlsx的基本使用

前言 在很多时候 ,我们需要将数据导出,之前我是将数据表导出为CSV格式,CSV文件虽然可以用Excel打开,但相对于真正的Xlsx文件,还是有许多不足的。偶然之间,发现了QtXlsx这个第三方库。 1、QtXlsx官网对QtX…

makefile工具的使用,编写一个或多个文件!(简单易上手)

一、make 和 makefile 是什么 1. make 是一个 命令。 2. makefile 是一个 文件,可以自动化的构建项目。 3. 编写 makefile 需要: (1)依赖关系 (2)依赖方法 二、什么是依赖关系、什么是依赖方法 下面我简单…

【Java】Java核心要点总结:60

文章目录 1. 乐观锁一定就是好的吗2. Synchronized和ReentrantLock有什么异同3. ReentrantLock是如何实现可重入性的4. 和Synchronized相比,可以重入锁ReentrantLock实现原理有什么不同5. AQS框架 1. 乐观锁一定就是好的吗 乐观锁并不一定好,它有自己的适…

chatgpt赋能python:Python实现将一张图片贴到另一张图片上

Python实现将一张图片贴到另一张图片上 在图像处理中,往往需要将多张图片合成一张图片。这里介绍使用Python实现将一张图片贴到另一张图片上的方法。 准备工作 在实现之前,我们需要安装Python的图像处理库Pillow和numpy。 可以通过pip进行安装&#…

创建一个SpringBoot项目

Spring的诞生是为了简化JAVA程序的开发的 快速开发Spring而诞生的 SpringBoot为了快速开发Spring而诞生的一个框架 1)什么是SpringBoot?为什么要学它?(重要) Spring是包含了众多工具方法的IOC容器 SpringBoot就是Spring框架的脚手架,它的存在就是为了快…

软考A计划-系统架构师-官方考试指定教程-(2/15)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…

chatgpt赋能python:Python屏幕输入介绍:了解命令行输入的基本知识

Python屏幕输入介绍:了解命令行输入的基本知识 Python是一种使用广泛的编程语言,用于编写各种类型的应用程序,包括图形用户界面应用程序和基于命令行的应用程序。对于基于命令行的应用程序来说,屏幕输入非常重要。本文将介绍Pyth…

Object.assign用法

Object.assign用法 Object.assign是什么? 首先了解下Object.assign()是什么。我们先看看ES6官方文档是怎么介绍的? Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。简单来说,就是Obj…

stm32超声波测距代码

操作思路: 初始化时将trig和echo端口都置低,首先向给trig 发送至少10 us的高电平脉冲(模块自动向外发送8个40K的方波),然后等待,捕捉 echo 端输出上升沿,捕捉到上升沿的同时,打开定时…