深入了解实现

时间:2018-08-28 04:35:47

标签: java interface

我有一个界面FileService 及其实现FileServiceBean

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

例如fileService.processFile(FileDescriptor);

在这里,fileDescriptor是一个类,例如

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

}

然后我想要FileServiceBean的多个扩展来处理不同的文件类型。而且FileServiceBean将具有所有文件类型通用的所有方法。

例如

PhotoProcessingBean extends FileProcessingBean
VideoProcessingBean extends FileProcesingBean

如何使界面决定要使用的实现?我对此很陌生,并且不太确定如何问问题以在Google上搜索答案。

理想情况下,它不只是接受FileDescriptor。例如可能只是文件。

fileService.processFile(Object);

2 个答案:

答案 0 :(得分:1)

好吧,最后您必须将决策逻辑放置在 where 处,唯一的问题是 where

我认为这是工厂模式的经典应用程序:您创建一个对象(“工厂”),其唯一目的是确定要为给定案例创建通用接口的具体实现。参见https://en.wikipedia.org/wiki/Factory_method_pattern

沿线:

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

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

答案 1 :(得分:0)

假设您有一个界面:

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是所有对象都是其后代的超类。实际上,您将打开“水闸”,并可能会遇到运行时错误。