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