我正在创建一个应用程序,用户在某个时刻提示创建一个新文件(对象不是OS中的文件)。该文件表示名为FilePack
的抽象类的几个子类之一。
用户将从列表中选择文件类型(在JOptionPane
中),然后该选项将转发到将创建相应子类的方法。
一个例子:
用户点击“创建新文件”按钮。 JOptionPane
附带了一个可用的FilePack
子类列表。用户选择“类型A”。选择转发到创建适当子类的方法。
这将是处理此操作的最佳方式,这将允许代码在引入新的FilePack
子类时工作,而无需到处处并更改代码位?
(此时你必须更改JOptionPane中的列表和创建子类的方法,但是可能需要在开发后的更多地方进行更改)
此外,是否可以从JOptionPane获取两个输入?一个使用textfield,一个使用list?我只能做一个。
答案 0 :(得分:3)
我建议使用enum作为选项:
enum FilePackSubclassOption {
TYPE_A() {
@Override
public FilePack createFilePack() {
return new FilePackTypeA();
}
@Override
public String getName() {
return "Type A";
}
};
public abstract FilePack createFilePack();
public abstract String getName();
@Override
public String toString() {
return getName();
}
}
要获取所有选项,您可以在FilePackClassOption.values()
中将options
用作JOptionPane
参数。当你添加FilePack
的新子类时,你只需要为枚举添加新值并实现2个方法。
使用示例:
public void chooseFilePack() {
Object selection = JOptionPange.showInputDialog(null,
"Select file pack type", "File pack", 0, null,
FilePackSubclassOption.values(), null);
if (selection != null) {
return ((FilePackSubclassOption)selection).createFilePack();
}
return null;
}
答案 1 :(得分:0)
IMO,这种情况的最佳解决方案是使用factory pattern。这通过使用抽象类FileFactory
来实现,其方法是生成通用File
。然后创建一个具体的因子,创建File
的实现。例如:
public interface FileFactory {
public File createFile();
}
public abstract class File {
}
public class File1 extends File {
}
public class File2 extends File {
}
public class ConcreteFileFactory implements FileFactory {
public File createFile(int fileType) {
switch(fileType) {
case 1: return new File1();
case 2: return new File2();
// etc.
}
}
}
现在添加新的File
只需要在File
实现中添加新的具体FileFactory
类和相应的案例。
然后在你的GUI中你有类似的东西:
int type = // get an int from selected type of file
File file = new ConcreteFileFactory().createFile(type);
这种模式有很多变化,这只是我改编自Applied Java Patterns的一个例子。