Создание расширяемого кода - PullRequest
1 голос
/ 14 января 2012

Я делаю приложение, в котором в какой-то момент пользователю предлагается создать новый файл (объект не файл в ОС). Этот файл представляет один из нескольких подклассов абстрактного класса с именем FilePack. Пользователь выберет тип файла из списка (в JOptionPane), затем эта опция будет перенаправлена ​​методу, который создаст соответствующий подкласс.

Пример: Пользователь нажимает кнопку «Создать новый файл». JOptionPane поставляется со списком доступных FilePack подклассов. Пользователь выбирает «Тип А». Выбор передается методу, который создает соответствующий подкласс.

Каков оптимальный способ обработки этой операции, который позволит коду работать при введении новых подклассов FilePack без необходимости везде ходить и менять биты кода?

(на данный момент вы должны изменить список в JOptionPane и метод, создающий подклассы, но его возможные изменения должны произойти в более поздних местах разработки)

Кроме того, возможно ли получить два входа из JOptionPane? Один с использованием текстового поля и один из списка? Я могу сделать только один раз.

Ответы [ 2 ]

3 голосов
/ 14 января 2012

Я бы предложил использовать 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, вам нужно только добавить новое значение в enum и реализовать 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;
}
0 голосов
/ 14 января 2012

IMO, лучшим решением для этого сценария будет использование фабричного шаблона . Это работает, имея абстрактный класс FileFactory, с методом, генерирующим общие File s. Затем вы создаете конкретный фактор, создавая реализации 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 s теперь требует только добавления нового конкретного класса File и соответствующего регистра в реализации FileFactory.

Тогда в вашем GUI у вас есть что-то вроде:

int type = // get an int from selected type of file
File file = new ConcreteFileFactory().createFile(type);    

Существует множество вариаций этого шаблона, это просто пример, который я адаптировал из Прикладные шаблоны Java .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...