gpt4 book ai didi

java - 读取不同文件格式的策略模式

转载 作者:行者123 更新时间:2023-11-30 02:44:33 25 4
gpt4 key购买 nike

public interface FileReader {

void readFile();
void writeFile();
}


public class XMLReader implements FileReader {

@Override
public void readFile() {
System.out.println("Hellp i am read");

}

@Override
public void writeFile() {
System.out.println("Hello i am write");
}


}

public class ExcelReader implements FileReader {

@Override
public void readFile() {
System.out.println("Hellp i am read");

}

@Override
public void writeFile() {
System.out.println("Hello i am write");
}

}

public class Context {

FileReader reader ;

public Context(FileReader reader) {
super();
this.reader = reader;
}

public void executeRead(){

reader.readFile();
}


}

public class TestStrategy {

public static void main(String[] args) {
// TODO Auto-generated method stub

System.out.println(args[0]);
String s=args[0];
String[] a=s.split("\\.");
if(a[1].equals("csv")){
new Context(new XMLReader()).executeRead();
}else{
new Context(new ExcelReader()).executeRead();
}
}

}

我担心引入更多文件格式,我们将为它们创建单独的类,但我必须更改 TestStrategy 类中的 if else 代码,以便为引入的文件模式创建新对象。

我们可以删除这个 if else 代码吗?有什么建议吗?

最佳答案

您可以使用将文件扩展名映射到实现的注册表。

public class Registry {
static Map<String,FileReader> reg = new HashMap<String,FileReader>();

public static void register(String ext, FileReader fr ) {
reg.put( ext, fr );
}
}

并让新添加的实现自行注册,例如

public class XMLReader implements FileReader {
static {
Registry.register( "xml", new XMLReader() );
}
....
public class ExcelReader implements FileReader {
static {
Registry.register( "xls", new ExcelReader() );
}
...

那么您可以简单地在注册表中查找合适的实现,而无需ifswitch

关于java - 读取不同文件格式的策略模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40591270/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com