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

news/2024/4/19 21:23:25

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.niftyadmin.cn/n/409350.html

相关文章

chatgpt赋能python:Python屏幕截图:完美的方法记录你的屏幕

Python屏幕截图:完美的方法记录你的屏幕 Python作为一种高级编程语言,被广泛用于开发各种应用程序和游戏,其中之一就是屏幕截图。 在本文中,我们将介绍使用Python进行屏幕截图的方法和技巧。 什么是屏幕截图? 屏幕截…

宝塔反代教程+国内服务器访问openai api接口+502 Bad Gateway问题解决!

前言 宝塔反代教程国内服务器访问openai api接口502 Bad Gateway问题解决! 此方法最简单快捷,没有复杂步骤,不容易出错,即最简单,零代码、零部署的方法。 实现前提 一台海外VPSOpenAI官方的API_KEYChatGPT网站系统源码 ChatGP…

STL——string模拟实现(一)

目录 构造函数的实现 拷贝构造 赋值重载 const问题 迭代器打印 范围for打印 运算符重载 reserve模拟 插入数据 push_back append 构造函数的实现 先贴出一段错误代码&#xff1a; #include<iostream> #include<assert.h> namespace zzl//避免与库冲突 {…

某电机修造厂变电所一次系统设计

摘要 由于国内人民生活水平的提高&#xff0c;科技不断地进步&#xff0c;控制不断地完善&#xff0c;从而促使变电所设计技术在电气系统领域占据主导权&#xff0c;也使得110kV变电所被广泛应用。在变电所系统设计领域中&#xff0c;110kV变电所成为目前一处亮丽的风景线&…

C++作业day1

思维导图 有以下定义&#xff0c;说明哪些量可以改变哪些不可以改变&#xff1f; const char *p; p指向的指向不能修改 const (char *) p; char *const p; p不能改 const char* const p; 都不能修改 …

chatgpt赋能python:Python开发手机软件的优势和挑战

Python开发手机软件的优势和挑战 随着智能手机的普及&#xff0c;移动应用开发已成为当前最热门的技术领域之一。随着越来越多的企业意识到移动应用的重要性&#xff0c;越来越多的开发者开始加入这个领域。 在移动应用的开发中&#xff0c;由于其高效性和易于学习的特点&…

【利用AI让知识体系化】前端安全攻防知识点

文章目录 1. 前言1.1 前端安全攻防的意义1.2 概述前端安全攻防的范畴和流程 2. 攻击技术2.1 XSS攻击2.1.1 原理和类型2.1.2 预防和防御 2.2 CSRF攻击2.2.1 原理和类型2.2.2 预防和防御 3. 代码层次3.1 JavaScript代码安全3.1.1 客户端JavaScript安全3.1.2 服务器端JavaScript安…

chatgpt赋能python:Python库使用指南

Python库使用指南 Python是一种高级编程语言&#xff0c;拥有丰富而强大的标准库和第三方库。在本文中&#xff0c;将介绍一些主要Python库的使用方法以及如何通过使用它们来提高SEO。 Requests库 Requests是一个流行的第三方库&#xff0c;用于HTTP请求和响应。可以使用它来…