2012-10-04 46 views
0

這是我想知道該怎麼做,但找不到適合該問題的方式。實現一個對象,兩種目的

假設我有一個類可以用於兩個目的:上傳和下載。本能地,我會有點創建一個對象是這樣的:

public class File{ 
private FormFile uploadFile; 
private File downloadFile; 
private String uploadLocation; 
private String downloadLocation; 

//setters and getters 
} 

的事情是,我想只有一個set訪問爲每種類型的。例如,班級中只有一個setFile(Object obj)。但是這會導致一個問題,因爲FormFile和File是兩個不同的對象。

我會然後訴諸OOP。我的對象更改爲:

public interface File{ 
public void setFile(Object obj); 
public Object getFile(); 
public void setLocation; 
public String getLocation; 
} 

然後創建兩個其他對象:

public UploadFile implements File{ 
private FormFile file; 
private String location; 

//implementation of methods 
} 

public Download implements File{ 
private File file; 
private String location; 

//implementation of methods 
} 

,如果你的代碼中清理其他的事情這可能是工作。但是我意識到這會很難在事後保持。是否有另一種解決方法來做到這一點?

東西

File file = new File.UPLOAD; 

會限制用戶:

只能使用方法setFile(FileForm file){ },然後setFile(File file){ }將變得不可用。實例時反之亦然File file = new File.DOWNLOAD

我並不是真的想解決這個問題。只是一個想法。

+2

其實這不是一個好的設計選擇。 _每個Class_的責任。所以你選擇分開下載和上傳類是好的。我看不到,爲什麼這應該更難保持? – Fildor

+0

爲什麼不定義一個擴展File的類,然後讓它的構造函數在上傳或下載的時候會得到一個參數?但幾乎@Fildor說的是對的! –

+0

查看維基百科上的[Cohesion頁面](http://en.wikipedia.org/wiki/Cohesion_(computer_science))。一個「模塊」(在這種情況下,一個類)應該只有一個責任。你的問題只會延伸到你的應用程序的其餘部分,因爲那時使用'File'的東西將不得不檢查它是什麼類型,強制使用它的任何地方的條件,因爲事情可能會根據它的類型做出不同的反應,並且會導致複雜和冗餘的代碼。分離關注點創建了一個更有凝聚力的模型。 – Brian

回答

1

嘗試使用泛型:

public class File <T> { 

    private T file; 
    private String location; 

    public T getFile() { 
     return file; 
    } 
    public void setFile(T file) { 
     this.file = file; 
    } 

    public String getLocation() { 
     return location; 
    } 
    public void setLocation(String location) { 
     this.location = location; 
    } 

} 

用法:

File<FormFile> uploadFile = new File<FormFile>(); 
uploadFile.setFile(new FormFile()); 

File<java.io.File> downloadFile = new File<java.io.File>(); 
downloadFile.setFile(new java.io.File("something.txt")); 
+0

這似乎解決了OP的問題。然而,你如何實現業務邏輯方法(上傳/下載)?無論如何,你必須明確地檢查類型。 – Kent

+0

我同意。這是因爲他不需要創建2個課程。 – icza

0

你過思考它。

只需添加這兩種方法:

public void setUploadFile(FormFile f); 

public void setDownloadFile(File f); 
+0

是的。但我在想,如果一個UPLOAD類型的FILE被實例化,'setDownloadFile(File f)'將不可用。 –

+0

'setDownloadFile(File f)'將如何變得不可用? 「上傳文件類型」是什麼意思? –

0

-Interface主要用於與提供角色的目的,或以表示不斷變化行爲,但由於上傳和下載兩種不同的事情,我不認爲界面將在這裏適當。

-嘗試類似這樣的...

文件類:

class File{ 

private String fileName; 
private String fileLocation; 

public File(String fileName, String fileLocation){ 

    this.fileName = fileName; 
    this.fileLocation = fileLocation; 

} 
     //Getters for the above Field 

public boolean setDownload(File f){ 

    new Download(f); // Composition 

} 

public boolean setUpload(File f){ 

     new Upload(f); // Composition 

} 
} 

下載類:

class Download{ 

private String fromDestination; 

// Getter and Setter for above field 

public boolean dowload(File f){ 


    return false; // set to true if successful 
} 

} 

上傳類:

class Upload{ 

private String toDestination; 

// Getter and Setter for above field 

public boolean upload(File f){ 


    return false; // set to true if successful 
} 

} 

那麼你可以使用Apache's commons庫爲文件上傳和文件下載 ....

相關問題