我正在创建一个使用 Apache POI 和 Opencsv 读取 CSV 和 Excel 文件的模块。
为了读取 CSV 文件,我创建了 1 个类和 2 个方法:
class CsvReader {
void open() {//implementation}
List<CsvDto1> get1() {//implementation}
List<CsvDto2> get2() {//implementation}
void close() {//implementation}
}
为了读取 Excel 文件,我还创建了 1 个类和 2 个方法:
class ExcelReader {
void open() {//implementation}
List<ExlDto1> get3() {//implementation}
List<ExlDto2> get4() {//implementation}
void close() {//implementation}
}
我想要的只是实现一种有助于将来维护的模式。所以我创建了一个名为 FileReadable
的接口(interface):
interface FileReadable {
void open();
List<CsvDto1> get1()
List<CsvDto2> get2()
List<ExlDto1> get3()
List<ExlDto2> get4()
void close();
}
然后 CsvReader
和 ExcelReader
将从 FileRedable
实现。问题是 get1()
和 get2()
存在于 CsvReader
中,但它们不存在于 ExcelReader
中,get3()
和 get4()
存在于 ExcelReader
中,但它们不存在于 CsvReader
中。如何为这两个类创建通用的 read
方法,或者我们是否有针对这种情况的设计模式?
interface FileReadable {
void open();
Reader read();
void close();
}
最佳答案
从您的问题中,我看到您有 Dto1
和 Dto2
。前缀 Csv
和 Exl
是实现的一部分,不应该是定义的一部分。您需要一个名为:
interface FileReadable {
void open();
List<Dto1> get1()
List<Dto2> get2()
void close();
}
然后您的客户将不会知道或关心它是否来自 Exl
或 Csv
。他们只会使用 Dto1
或 Dto2
。如果您确实需要知道来源,可以在 Dto
类中创建属性,该属性可以具有 EXCEL
、CSV
等值。
关于java - 文件阅读器的设计模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74268757/