2016-11-14 23 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類中的if else代碼來創建新的對象文件模式介紹。策略模式來讀取不同的文件格式

我們可以刪除這個if其他代碼。任何建議。

+1

您是否熟悉工廠模式? – bradimus

+0

你可以使用和抽象類來做類似'if(test == ok)readFile'的類,那麼你的每個類都會繼承這個行爲。現在你的狀態將不得不遍歷每一個繼承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

您可以按名稱獲得課程。構建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