【函数式接口使用✈️✈️】配合策略模式实现文件处理的案例

目录

🍸前言

🍻一、功能描述

🍺二、面向对象设计模式

🍹三、策略模式

🍦四、策略 VS 面向对象

🍨章末


🍸前言

        小伙伴们大家好,上周初步了解了下函数式接口,Consumer,Supplier,Function等接口的使用,以及结合而策略模式实现购物促销功能的案例实现,这里再配合实现文件处理的功能,案例比较简单,主要是看策略模式和普通面向对象模式的区别

🍻一、功能描述

假设我们需要实现一个文件处理器,能够读取文件内容,并根据不同的处理策略对文件内容进行处理,例如将文件内容转换为大写、小写或者进行加密。

🍺二、面向对象设计模式

       (1) 这种方式逻辑比较清晰,就是创建一个文件处理器类,该类中有各种文件内容处理方法,比如内容转大写或者加密,文件处理器类如下:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;public class FileProcessor {public void processFileToUpper(String filename) throws IOException {try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {String line;while ((line = reader.readLine()) != null) {String processedLine = line.toUpperCase();System.out.println(processedLine); // 可替换为具体处理逻辑,比如写入到另一个文件}}}public void processFileToLower(String filename) throws IOException {try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {String line;while ((line = reader.readLine()) != null) {String processedLine = line.toLowerCase();System.out.println(processedLine); }}}public void processFileEncrypt(String filename) throws IOException {try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {String line;while ((line = reader.readLine()) != null) {// 这里只是演示,实际的加密算法应该更复杂String processedLine = line.replaceAll("[a-zA-Z]", "*");System.out.println(processedLine); }}}
}

        (2)测试下,使用很简单,实例化一个文件处理器对象,通过对象调用其具体的处理方法即可

import java.io.IOException;public class TestFile {public static void main(String[] args) {String filename = "C:\\Users\\ben.huang\\Desktop\\testFile.txt";FileProcessor fileProcessor = new FileProcessor();try {System.out.println("File content in uppercase:");fileProcessor.processFileToUpper(filename);System.out.println("\nFile content in lowercase:");fileProcessor.processFileToLower(filename);System.out.println("\nFile content encrypted:");fileProcessor.processFileEncrypt(filename);} catch (IOException e) {e.printStackTrace();}}
}

🍹三、策略模式

        (1)也是创建一个文件处理器类,不过该类中只有一个处理方法,具体地 实现功能要根据传入地函数名称去处理,文件处理器类如下:

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;/*** @author ben.huang*/
public class FileFunction {public void processFile (String fileName, Function<String,String> processingStrategy) throws IOException {//supplier 相当于生产者,调用该函数会获取到文件地读取流Supplier<BufferedReader> fileReadSupplier = () ->{try {return new BufferedReader(new FileReader(fileName));} catch (FileNotFoundException e) {throw new RuntimeException("error opening file"+e);}};//相当于一个消费者,根据传入的函数去消费每一行读取到地数据Consumer<String> fileProcessor = line ->{String apply = processingStrategy.apply(line);System.out.println(apply);};//获取输入流BufferedReader reader = fileReadSupplier.get();String line;//依次处理每行输入流while((line = reader.readLine()) != null){fileProcessor.accept(line);}}
}

         (2)具体地文件处理函数可以单独写到一个类中,因为后期如果需要添加新的处理函数,直接在这里进行扩展即可,文件处理函数如下:

import java.util.function.Function;/*** @author ben.huang*/
public class FileProcessingStrategies {//返回的是函数表达式public static Function<String,String> toUpperCase(){return String::toUpperCase;}public static Function<String,String> toLowerCase(){return String::toLowerCase;}public static Function<String,String> encrypt(){return str -> str.replaceAll("[a-zA-Z]","*");}
}

        (3)测试下

import java.io.IOException;/*** @author ben.huang*/
public class TestFileFunction {public static void main(String[] args) {String fileName = "C:\\Users\\ben.huang\\Desktop\\testFile.txt";FileFunction fileFunction = new FileFunction();try {//方法调用的时候,传入需要的处理函数即可System.out.println("File content in uppercase:");fileFunction.processFile(fileName,FileProcessingStrategies.toUpperCase());System.out.println("\nFile content in lowercase:");fileFunction.processFile(fileName,FileProcessingStrategies.toLowerCase());System.out.println("\nFile content in encrypted:");fileFunction.processFile(fileName,FileProcessingStrategies.encrypt());} catch (IOException e) {throw new RuntimeException(e);}}
}

🍦四、策略 VS 面向对象

         首先来看面向对象设计模式,这种方式是我在初学地时候最喜欢的编码方式,这种逻辑方便观看,易读性强,调用方便,代码方便别人阅读,修改方便,直接CV修改修改就行,整个功能在一个类中全部实现,省了来回跳看的眼花,还有....(等等,串台了(bushi))

        那我们为社么还要用策略模式呢?

不知大家可曾听闻开闭原则,依鄙人来看就是说不要去修改原有的类,而是去扩展。比如说,现在又加了几个文件处理器功能,策略模式只需要在策略函数类中新增几个函数,如果使用面向对象的话,需要新增几个方法,并且这些方法中有很多代码重复,冗余度很高

        总的来说,策略模式更加直接,通过定义不同的策略类来实现不同的功能,并且可以在运行时动态切换策略。而面向对象设计模式则更加灵活,可以根据具体的需求选择不同的设计模式来实现文件处理功能

🍨章末

        文章到这里就结束了~

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

激光雷达(LiDAR)面临的主要问题与挑战

本文讨论目前激光雷达在汽车、机器人以及无人机等场景应用时面临的一些问题和挑战,包括成本、尺寸、系统复杂性、杂散反射、续航,以及安全性等方面。 成本 一直以来,激光雷达的成本都是影响其广泛应用的关键因素。从最早的上万美元一颗,经过近十年的发展,激光雷达的价格…

E-MapReduce极客挑战赛季军方案

前一段时间我参加了E-MapReduce极客挑战赛&#xff0c;很幸运的获得了季军。在这把我的比赛攻略给大家分享一下&#xff0c;希望可以抛砖引玉。 赛题分析与理解 赛题背景&#xff1a; 大数据时代&#xff0c;上云已成为越来越多终端客户大数据方案的落地选择&#xff0c;阿里…

Ai-WB2 系列模组SDK接入亚马逊云

文章目录 前言一、准备二、亚马逊云物模型建立1. 注册亚马逊账号&#xff0c;登录AWS IoT控制台&#xff0c;[注册地址](https://aws.amazon.com/cn/)2. 创建好之后点击登录3. 创建物品以及下载证书 三、连接亚马逊云demo获取以及配置1. 下载源码2. 按照顺序执行下面指令3. 修改…

查看项目go代码cpu利用率

1.代码添加&#xff1a; "net/http"_ "net/http/pprof"第二步&#xff0c;在代码开始运行的地方加上go func() {log.Println(http.ListenAndServe(":6060", nil))}() 2.服务器上防火墙把6060打开 3.电脑安装&#xff1a;Download | Graphviz …

sqlplus / as sysdba登陆失败,(ORA-01017)

周一上班检查alert log&#xff0c;看到某个库报出大量的错误 提示无法连接到ASM实例&#xff0c;这是某知名MES厂商DBA创建的11G RAC刚刚​转交到我手上的&#xff0c;这又是给我挖了什么坑&#xff1f; 报错为ORA-01017​用户名密码不对&#xff1f;​what&#xff1f; 登陆o…

计算机网络 --- WebSocket协议 和 Signalr

计算机网络 --- WebSocket协议 和 Signalr 什么是WebSocket什么是SignalrSignalr Example -- SimpleChat 什么是WebSocket HTTP是基于TCP协议的&#xff0c;同一时间里&#xff0c;客户端和服务器只能有一方主动发数据&#xff0c;是半双工通信。 通常&#xff0c;打开某个网页…

性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法

文章目录 一、前言二、加密接口1、什么是SM22、被测接口加密逻辑 三、准备工作四、JMeter 扩展实现步骤1&#xff1a;准备开发环境步骤2&#xff1a;了解实现方法步骤3&#xff1a;runTest 方法步骤4&#xff1a;getDefaultParameters 方法步骤5&#xff1a;setupTest 方法 五、…

一句话或一张图讲清楚系列之——ISERDESE2的原理

主要参考&#xff1a; https://blog.csdn.net/weixin_50810761/article/details/137383681 xilinx原语详解及仿真——ISERDESE2 作者&#xff1a;电路_fpga https://blog.csdn.net/weixin_45372778/article/details/122036112 Xilinx ISERDESE2应用笔记及仿真实操 作者&#x…

信息系统项目管理师0063:软件设计(5信息系统工程—5.1软件工程—5.1.3软件设计)

点击查看专栏目录 文章目录 5.1.3软件设计1.结构化设计2.面向对象设计3.设计模式记忆要点总结5.1.3软件设计 软件设计是需求分析的延伸与拓展。需求分析阶段解决“做什么”的问题,而软件设计阶段解决“怎么做”的问题。同时,它也是系统实施的基础,为系统实施工作做好铺垫。合…

STL Array、ForwardList源码剖析

STL Array、ForwardList源码剖析 参考文章: https://blog.csdn.net/weixin_45389639/article/details/121618243 array 源代码 template<typename _Tp,std::size_t _Nm> struct array {typedef _Tp value_type;typedef _Tp* pointer;typedef value_type* iterator;// Su…

Jenkins CI/CD 持续集成专题一 Jenkins的安装和配置

一 jenkins 官方教程 安装Jenkins 二 安装 2.1 安装方式一 通过安装包的package方式安装 第一步下载链接&#xff1a; Download the latest package 第二步操作方式&#xff1a;打开包并按照说明操作即可安装 2.2 安装方式二 brew安装 第一 安装最新版本jenkins brew in…

ScanNet 数据集常见文件的作用极其读取方式

ScanNet 数据集是一个大规模的 RGB-D 视频数据集&#xff0c;它包含了丰富的三维场景理解任务所需的数据&#xff0c;如三维物体分类、语义体素标签和 CAD 模型检索等。数据集中的每个文件都有特定的作用&#xff0c;以下是一些常见文件及其作用的解释&#xff1a; _vh_clean.p…