读取不同文件格式的策略模式
Strategy pattern to read different file formats
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();
}
}
}
我担心引入了更多文件格式,我们将为它们单独创建 class,但我必须更改 TestStrategy class 中的 if else 代码,为引入的文件模式创建新对象.
我们可以删除这个 if else 代码吗?有什么建议吗?
你可以通过名字得到一个class。构建一个 Map
以配置 FileReader
以用于每个扩展。
public static void main(String[] args)
throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Map<String, String> extensionToClass = new HashMap<>();
extensionToClass.put("xml", "de.lhorn.XMLReader");
extensionToClass.put("xls", "de.lhorn.ExcelReader");
String s = "foo.xml";
String[] a = s.split("\.");
String extension = a[1];
// Get the class that is configured for the extension.
String className = extensionToClass.get(extension);
Class clazz = Class.forName(className);
// Create a new instance of this class.
FileReader reader = (FileReader) clazz.newInstance();
// Use the FileReader.
new Context(reader).executeRead();
}
当然,您可以从外部来源阅读 extensionToClass
。
您可以使用将文件扩展名映射到实现的注册表。
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() );
}
...
那么您可以简单地在注册表中查找合适的实现,而无需 if 或 switch。
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();
}
}
}
我担心引入了更多文件格式,我们将为它们单独创建 class,但我必须更改 TestStrategy class 中的 if else 代码,为引入的文件模式创建新对象.
我们可以删除这个 if else 代码吗?有什么建议吗?
你可以通过名字得到一个class。构建一个 Map
以配置 FileReader
以用于每个扩展。
public static void main(String[] args)
throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Map<String, String> extensionToClass = new HashMap<>();
extensionToClass.put("xml", "de.lhorn.XMLReader");
extensionToClass.put("xls", "de.lhorn.ExcelReader");
String s = "foo.xml";
String[] a = s.split("\.");
String extension = a[1];
// Get the class that is configured for the extension.
String className = extensionToClass.get(extension);
Class clazz = Class.forName(className);
// Create a new instance of this class.
FileReader reader = (FileReader) clazz.newInstance();
// Use the FileReader.
new Context(reader).executeRead();
}
当然,您可以从外部来源阅读 extensionToClass
。
您可以使用将文件扩展名映射到实现的注册表。
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() );
}
...
那么您可以简单地在注册表中查找合适的实现,而无需 if 或 switch。