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