【问题标题】:Implementing One Object, Two Kinds of Purposes实现一个对象,两种目的
【发布时间】:2012-10-04 13:55:03
【问题描述】:

这是我想知道如何做的事情,但找不到适合该问题的方法。

假设我有一个可以用于两个目的的类:上传和下载。本能地,我会创建一个有点像这样的对象:

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

 //setters and getters
}

问题是,我希望每种类型只有一组访问器。例如,班级中只有一个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时反之亦然

我并没有真正尝试解决任何问题。只是一个想法。

【问题讨论】:

  • 其实这不是一个好的设计选择。 每个班级一个责任。所以你选择分离到下载和上传类是好的。我看不出来,为什么这应该更难维护?
  • 为什么不定义一个扩展 File 的类,然后让类的构造函数在上传或下载时获得参数?但@Fildor 说的几乎都是对的!
  • 看看Cohesion page on Wikipedia。一个“模块”(在这种情况下是一个类)应该只有一个职责。你的问题只会延伸到你的应用程序的其余部分,因为那时使用File 的东西必须检查它是什么类型,在它使用的任何地方强制使用条件,因为事情可能会根据它的类型做出不同的反应,这将导致非常复杂和冗余的代码。关注点分离创建了一个更具凝聚力的模型。
  • @Fildor 如果是为了代码重用呢?这可以否决?
  • 问题出在您的设计上。 “上传”和“下载”是非常不同的东西。因为您试图将两个不完全兼容的操作组合在一起,所以结果没有多大意义。

标签: java oop


【解决方案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" ) );

【讨论】:

  • 这似乎解决了 OP 的问题。但是,您如何实现业务逻辑方法(上传/下载)?无论如何,您都必须明确检查类型。
  • 我同意。这样他就不必创建 2 个类。
【解决方案2】:

你想多了。

只需添加这两个方法:

public void setUploadFile(FormFile f);

public void setDownloadFile(File f);

【讨论】:

  • 是的。但我在想,如果实例化了 FILE 的 UPLOAD 类型,setDownloadFile(File f) 将不可用。
  • setDownloadFile(File f) 将如何变得不可用? “文件的上传类型”是什么意思?
【解决方案3】:

- 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 库进行文件上传和文件下载....

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    • 2011-05-01
    • 2016-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多