设计模式——模板方法模式封装.net Core读取不同类型的文件
1、模板方法模式
模板方法模式:定义一个操作中的算法骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
特点:通过把不变的行为搬移到超类,去除子类中重复的代码来体现它的优势。
模板方法模式提供了一个很好的代码复用平台。当不变的和可变的行为在子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。我们通过模板方法模式把这些行为搬移到单一的地方,这样就帮助子类摆脱重复的不变的行为的纠缠。
2、Net Core 读取的类型文件
读取不同类型文件的代码
//读取JSONConfigurationBuilder builder = new ConfigurationBuilder();builder.AddJsonFile("configuration.json");var config = builder.Build();var collections = config.AsEnumerable();//读取INIConfigurationBuilder builder = new ConfigurationBuilder();builder.AddIniFile("configuration.ini");var config = builder.Build();var collections = config.AsEnumerable();//读取XMLConfigurationBuilder builder = new ConfigurationBuilder();builder.AddXmlFile("configuration.xml");var config = builder.Build();var collections = config.AsEnumerable();
如上代码:如果不使用模板方法模式,定义读取文件基类,子类中重写读取方法,如下代码
//定义读取文件的基类public abstract class AFileRead{public abstract void Read(string path);}//定义读取JSON文件的子类public class FileReadJson:AFileRead{public override void Read(string path){ConfigurationBuilder builder = new ConfigurationBuilder();builder.AddJsonFile(path);var config = builder.Build();var collections = config.AsEnumerable();}}//定义读取INI文件的子类
public class FileReadIni : AFileRead
{public override void Read(string path){ConfigurationBuilder builder = new ConfigurationBuilder();builder.AddIniFile(path);var config = builder.Build();var collections = config.AsEnumerable();}
}
//定义读取XML文件的子类public class FileReadXml:AFileRead{public override void Read(string path){ConfigurationBuilder builder = new ConfigurationBuilder();builder.AddXmlFile(path);var config = builder.Build();var collections = config.AsEnumerable();}}
上述代码中,只有一行读取不同类型文件代码不同,其余代码都相同。这只是单独的一个读取文件的功能,代码量很小,如果是一个特别大的功能,代码过多,那么如果要更改的话,工作量也是很大的。
为了减少重复的代码,如何去解决这个问题?
这个时候,模板方法模式,就起作用了。模板方法模式将子类中不变的行为定义到基类中,子类中只留下可变的行为,这样子类中就摆脱了重复代码的纠缠,代码如下:
//定义读取文件的接口
public interface IFileRead
{IEnumerable<KeyValuePair<string,string>> ReadFile();
}//定义读取文件,封装重复代码,将可变的行为延迟到子类中实现
public abstract class AFileRead : IFileRead
{public IEnumerable<KeyValuePair<string, string>> ReadFile(){ConfigurationBuilder builder = new ConfigurationBuilder();AddFile(builder); var config = builder.Build();var collections = config.AsEnumerable();return collections;}//这个函数需要延迟到子类中去实现protected abstract IConfigurationBuilder AddFile(ConfigurationBuilder builder);
}
//读取JSON文件
public class ReadJsonFile : AFileRead
{protected override IConfigurationBuilder AddFile(ConfigurationBuilder builder){return builder.AddJsonFile("configuration.json");}
}
//读取XML文件
public class ReadXmlFile : AFileRead
{protected override IConfigurationBuilder AddFile(ConfigurationBuilder builder){return builder.AddXmlFile("configuration.xml");}
}
//读取Ini文件
public class ReadIniFile : AFileRead
{protected override IConfigurationBuilder AddFile(ConfigurationBuilder builder){return builder.AddIniFile("configuration.ini");}
}
总结: 模板方法模式,帮助我们封装了不变的行为,涉及到实现某些特定步骤时,就延迟到了子类中去实现,在更改某个读取文件的函数时,不会影响到其他读取文件的功能。
相关文章:
设计模式——模板方法模式封装.net Core读取不同类型的文件
1、模板方法模式 模板方法模式:定义一个操作中的算法骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 特点:通过把不变的行为搬移到超类,去除子类中重复的代…...
[思考记录]技术欠账
最近对某开发项目做回顾梳理,除了进一步思考整理相关概念和问题外,一个重要的任务就是清理“技术欠账”。 这个“技术欠账”是指在这个项目的初期,会有意无意偏向快速实现,想先做出来、用起来,进而在实现过程中做出…...
React - 实现菜单栏滚动
简介 本文将会基于react实现滚动菜单栏功能。 技术实现 实现效果 点击菜单,内容区域会自动滚动到对应卡片。内容区域滑动,指定菜单栏会被选中。 ScrollMenu.js import {useRef, useState} from "react"; import ./ScrollMenu.css;export co…...
线性筛选(欧拉筛选)-洛谷P3383
#include <bits/stdc.h> using namespace std; int main() {std::ios::sync_with_stdio(false); cin.tie(nullptr); //为了加速int n, q;cin >> n >> q; vector<int>num(n 1); //定义数字表vector<int>prime; //定义素数表数组num[1] …...
企业微信可以更换公司主体吗?
企业微信变更主体有什么作用?当我们的企业因为各种原因需要注销或已经注销,或者运营变更等情况,企业微信无法继续使用原主体继续使用时,可以申请企业主体变更,变更为新的主体。企业微信变更主体的条件有哪些࿱…...
Qt教程 — 3.6 深入了解Qt 控件:Display Widgets部件(2)
目录 1 Display Widgets简介 2 如何使用Display Widgets部件 2.1 QTextBrowser组件-简单的文本浏览器 2.2 QGraphicsView组件-简单的图像浏览器 Display Widgets将分为两篇文章介绍 文章1(Qt教程 — 3.5 深入了解Qt 控件:Display Widgets部件-CSDN…...
Golang案例开发之gopacket抓包三次握手四次分手(3)
文章目录 前言一、理论知识三次握手四次分手二、代码实践1.模拟客户端和服务器端2.三次握手代码3.四次分手代码验证代码完整代码总结前言 TCP通讯的三次握手和四次分手,有很多文章都在介绍了,当我们了解了gopacket这个工具的时候,我们当然是用代码实践一下,我们的理论。本…...
如何减少pdf的文件大小?pdf压缩工具介绍
文件发不出去,有时就会耽误工作进度,文件太大无法发送,这应该是大家在发送PDF时,常常会碰到的问题吧,那么PDF文档压缩大小怎么做呢?因此我们需要对pdf压缩后再发送,那么有没有好用的pdf压缩工具…...
TypeScript基础类型
string、number、bolean 直接在变量后面添加即可。 let myName: string Tomfunction sayHello(person: string) {return hello, person } let user Tom let array [1, 2, 3] console.log(sayHello(user))function greet(person: string, date: Date): string {console.lo…...
长安链智能合约标准协议第二草案——BNS与DID协议邀请社区用户评审
长安链智能合约标准协议 在智能合约编写过程中,不同的产品及开发人员对业务理解和编程习惯不同,即使同一业务所编写的合约在具体实现上也可能有很大差异,在运维或业务对接中面临较大的学习和理解成本,现有公链合约协议规范又不能完…...
安防监控视频汇聚平台EasyCVR接入海康Ehome设备,设备在线但视频无法播放是什么原因?
安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…...
【Python + Django】表结构创建
以员工管理系统为例。 事前呢,我们先把项目和app创建出来,详细步骤可以看我同栏目的第一篇、第二篇文章。 我知道你们是不会下来找的,就把链接贴在下面吧: 【Python Django】启动简单的文本页面-CSDN博客 【Python Django】…...
解锁编程潜能:ChatGPT如何革新软件开发
目录 一、背景 二、功能描述 三、总结 一、背景 在这个飞速发展的数字时代,软件开发的效率和质量成了衡量一个开发者能力的重要标准。随着人工智能技术的不断进步,越来越多的开发者开始寻找能够提升工作效率的新方法。我就是其中之一,最近…...
内网使用rustdesk进行远程协助
文章目录 前言一、搭建rustdesk中继服务器二、搭建文件下载服务器三、创建引导脚本四、使用 前言 内网没有互联网环境,没法使用互联网上有中继服务器的远程协助工具,如teamviewer、todesk、向日癸等;在内网进行远程维护可以自己搭建中继服务…...
linux内核input子系统概述
目录 一、input子系统二、关键数据结构和api2.1 数据结构2.1.1 input_dev2.1.2 input_handler2.1.3 input_event2.1.4 input_handle 2.2 api接口2.2.1 input_device 相关接口input_device 注册流程事件上报 2.2.2 input handle 相关接口注册 handle指定 handle 2.2.3 input han…...
【解决报错】vi/vim修改文件时报错:Found a swap file by the name xxxxx
目录 报错内容报错原因解决方法 报错内容 vim打开文件提示: Found a swap file by the name xxxxx报错原因 使用vi或vim编辑器编写代码时由于网络不稳定(或其他种种原因)断开了连接,编辑好的代码没有运行和保存,再次…...
BRAM底层原理详细解释(1)
目录 一、原语 二、端口简述 2.1 端口简介 2.2 SDP端口映射 三、端口信号含义补充说明 3.1 字节写使能(Byte-Write Enable)- WEA and WEBWE: 3.2 地址总线—ADDRARDADDR and ADDRBWRADDR 3.3 数据总线—DIADI, DIPADIP, DIBDI, and D…...
GEE:为什么在机器学习分类或回归时,提取特征变量后的样本点下载到本地时,数据为空且缺少坐标?
作者:CSDN @ _养乐多_ 在博客《GEE:随机森林分类教程(样本制作、特征添加、训练、精度、参数优化、贡献度、统计面积)》和《GEE:随机森林回归预测教程(样本点、特征添加、训练、精度、参数优化、贡献度)》中,详细记录了在 Google Earth Engine(GEE)平台上进行机器学…...
电脑安装双系统windows和ubuntu server
1.创建Ubuntu-server的启动盘 首先要从官网下载Ubuntu-server18.04的ISO文件,用rufs烧录到U盘。如下所示 2. 磁盘分区 在windows创建两个盘(linuxboot 和linuxroot),后面一个一个用于boot,一个用于root. 3.开机U盘启…...
掌握这8大工具,自媒体ai写作之路畅通无阻! #媒体#媒体
在当今信息爆炸的时代,写作成为了人们表达思想、分享知识和传递情感的重要方式之一。对于很多人来说,写作并非易事。我们会陷入困境,无法找到灵感,我们会苦恼于语言表达的准确性,还有时候我们可能遭遇到了创作瓶颈&…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
如何在Windows本机安装Python并确保与Python.NET兼容
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...
AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)
Name:3ddown Serial:FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名:Axure 序列号:8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...
