Java 让我的脑袋转过来

Java 让我的脑袋转过来,java,interface,Java,Interface,我有一个interfaceFileService 以及it FileServiceBean的一个实现 我希望能够处理多种文件类型 e、 g.fileService.processFileDescriptor 其中,fileDescriptor是一个类,例如 public class FileDescriptor { @Column(name = "FILE_TYPE") protected String fileType; } 然后我需要FileServiceBean的多个扩展来处理不同的文件

我有一个interfaceFileService 以及it FileServiceBean的一个实现

我希望能够处理多种文件类型

e、 g.fileService.processFileDescriptor

其中,fileDescriptor是一个类,例如

public class FileDescriptor {
@Column(name = "FILE_TYPE")
protected String fileType;
}

然后我需要FileServiceBean的多个扩展来处理不同的文件类型。FileServiceBean将具有所有文件类型所共有的所有方法

e、 g

如何使接口决定使用什么实现?我对这一点相当陌生,也不太确定如何提问才能在谷歌搜索答案

理想情况下,它不会只接受FileDescriptor。e、 它可能是像文件一样的东西

fileService.processFile(Object);

假设您有一个接口:

public interface IFileService{
    void processFile();
}
以及实现此功能的FileProcessingBean类:

public class FileProcessingBean implements IFileService{

    //other code here

    @Override
    public void processFile(){
        //add code for implementation of method
    }
}
如果您还有两个扩展FileProcessingBean的类:

public class PhotoProcessingBean extends FileProcessingBean{
    @Override
    public void processFile(){
        System.out.println("Processing PHOTO...");
    }
}


public class VideoProcessingBean extends FileProcessingBean{
    @Override
    public void processFile(){
        System.out.println("Processing VIDEO...");
    }
}
如果您想使用它:

//This is an OOP concept called Polymorphism:
IFileService photoProcess = new PhotoProcessingBean();
IFileService videoProcess = new VideoProcessingBean();
调用photoProcess.processFile;和videoProcess.processFile将产生不同的实现:

photoProcess.processFile();
videoProcess.processFile();
您将获得以下输出:

Processing PHOTO...
Processing VIDEO...

关于您不仅要接受FileDescriptor,还要接受“其他东西”的观点,我的建议是确切地知道您期望的参数类型,然后实现重写方法或通过接口。使用Object作为方法参数是不明智的,因为Object是一个超类,所有对象都是它的后代。实际上,您将打开“闸门”,并可能遇到运行时错误。

好吧,最后您必须将决策逻辑放在某个地方,唯一的问题是在哪里

我认为这是工厂模式的一个经典应用:您创建了一个对象,工厂的唯一目的是决定为给定情况创建公共接口的具体实现。看

大致如下:

PhotoProcessingBean extends FileProcessingBean {...}
VideoProcessingBean extends FileProcesingBean {...}

class FileProcessingFactory {
    public static FileService createFileService(FileDescriptor descriptor) {
        switch(descriptor.getFileType()) {
            case 'Photo': return new PhotoProcessingBean();
            case 'Video': return new VideoProcessingBean();
            default: // do some error handling
        }
    }
}
使用它:

for(FileDescriptor descriptor : /* wherever they come from */) {
    FileService processor = FileProcessingFactory.createFileService(descriptor);
    processor.processFile(descriptor);
}

当然,您也可以通过接受对象而不是文件描述符来软化接口。这取决于具体的应用程序。

您有什么类型的文件描述符?听起来您根本不需要文件描述符,因为每个具体bean将处理特定的文件类型。此外,接口并不决定使用什么实现。接口只是一个契约,它规定了您的实现必须实现哪些方法。接口并不决定任何事情。您创建了一个对象,比如使用新的PhotoProcessingBean,它恰好实现了接口。您可能正在寻找一种工厂模式,工厂将根据文件类型实例化正确的对象。谢谢:
for(FileDescriptor descriptor : /* wherever they come from */) {
    FileService processor = FileProcessingFactory.createFileService(descriptor);
    processor.processFile(descriptor);
}