创建可扩展代码

时间:2012-01-14 15:26:40

标签: java design-patterns

我正在创建一个应用程序,用户在某个时刻提示创建一个新文件(对象不是OS中的文件)。该文件表示名为FilePack的抽象类的几个子类之一。 用户将从列表中选择文件类型(在JOptionPane中),然后该选项将转发到将创建相应子类的方法。

一个例子: 用户点击“创建新文件”按钮。 JOptionPane附带了一个可用的FilePack子类列表。用户选择“类型A”。选择转发到创建适当子类的方法。

这将是处理此操作的最佳方式,这将允许代码在引入新的FilePack子类时工作,而无需到处处并更改代码位?

(此时你必须更改JOptionPane中的列表和创建子类的方法,但是可能需要在开发后的更多地方进行更改)

此外,是否可以从JOptionPane获取两个输入?一个使用textfield,一个使用list?我只能做一个。

2 个答案:

答案 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的一个例子。