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

Java 读取不同文件格式的策略模式,java,strategy-pattern,Java,Strategy Pattern,我担心会引入更多的文件格式,我们将为它们创建单独的类,但我必须更改TestStrategy类中的if-else代码,以便为引入的文件模式创建新对象 我们可以删除这个if-else代码吗。有什么建议吗。您可以按名称获取一个类。构建一个映射来配置用于每个扩展的文件读取器 public interface FileReader { void readFile(); void writeFile(); } public class XMLReader implements FileRe

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


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

您可以按名称获取一个类。构建一个
映射
来配置用于每个扩展的
文件读取器

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();
    }
}

}
publicstaticvoidmain(字符串[]args)
抛出ClassNotFoundException、InstanceionException、IllegalAccessException{
Map extensionToClass=new HashMap();
extensionClass.put(“xml”、“de.lhorn.XMLReader”);
extensionClass.put(“xls”、“de.lhorn.ExcelReader”);
字符串s=“foo.xml”;
字符串[]a=s.split(\\);
字符串扩展名=a[1];
//获取为扩展配置的类。
String className=extensionToClass.get(扩展名);
Class clazz=Class.forName(className);
//创建该类的新实例。
FileReader=(FileReader)clazz.newInstance();
//使用文件阅读器。
新上下文(reader.executeRead();
}

当然,您可以从外部源读取扩展类。

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

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();
}

然后,您可以简单地在注册表中查找一个合适的实现,而不需要if或switch。

您熟悉工厂模式吗?您可以使用和抽象类来执行类似于
if(test==ok)readFile
的操作,然后您的每个类都将继承此行为。现在,您的策略必须遍历继承abtract类的每个类。每一种策略都会概括出她自己的情况
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() );
        }
...