2016-11-14 14 views
1
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クラスであれば、他のコードを変更する必要があります。Strategyパターンは、異なるファイル形式

他にもコードがありましたらお知らせください。

+1

工場パターンに精通していますか? – bradimus

+0

'if(test == ok)readFile'のようなことをする抽象クラスを使うことができます。そして、それぞれのクラスはこの振る舞いを継承します。あなたのstategyはabtractクラスを継承するすべてのクラスをループしなければなりません。各戦略は自分の状態をカプセル化します –

答えて

1

ファイル拡張子を実装にマップするレジストリを使用できます。

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

あなたは単に場合やスイッチは不要との適切な実装のために、レジストリを検索できます。

1

名前でクラスを取得できます。各拡張にFileReaderを使用するように構成するには、Mapを作成します。

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を読むことができます。

関連する問題