Java структура / шаблон (ы) для возврата определенного поля из подклассов - PullRequest
0 голосов
/ 25 марта 2012

Для проекта у нас есть требование создать определение интерфейса, которое будет возвращать все доступные расширения типов файлов, которые может экспортировать наш компонент ...

Проблема в том, что мы хотим избежать файлов конфигурации / свойств. Мы не хотим редактировать наш файл настроек / свойств при добавлении другого типа файла (в будущем). Структура этой части нашего компонента выглядит следующим образом:

public abstract class FileType {
    protected String filetype;

    public FileType(String filetype){
        this.filetype = filetype;
    }

    public abstract void export(String path, Object information);
}


public class PdfExport extends FileType {
    public PdfExport() {
        super("pdf");
    }

    public void export(String path, Object information){
        //pdf specific logic
    }
}

Но как мы решаем это, когда другой компонент вызывает определение интерфейса getExportTypes()? (Как получить список всех доступных типов файлов?) Принимая во внимание требование добавить в будущем новые классы, расширяющие абстрактный тип файла (добавьте новые типы файлов)?

У кого-нибудь есть предложения, может быть, другая структура из приведенного выше примера? Или любой (дизайн), который обсуждает вышеупомянутый вопрос?

Заранее спасибо!

Ответы [ 3 ]

3 голосов
/ 25 марта 2012

Вы можете сделать что-то вроде этого:

public interface FileType {
    public String getFileType();
    public void export(String path, Object info);
}

public enum DefaultFileType implements FileType {
    PDF(".pdf"){
        public void export(String path, Object info) {
            // do pdf stuff
        }
    }, TXT(".txt"){
        public void export(String path, Object info) {
            //do txt stuff
        }
    };

    private final String fileType;

    private DefaultFileType(String fileType) {
        this.fileType = fileType;
    }

    public String getFileType() {
        return fileType;
    }

    public abstract void export(String path, Object info);
}

Тогда вы можете иметь Set<FileType> в вашем классе всех поддерживаемых FileType с.Таким образом, любой, кто хочет добавить поддерживаемый FileType, но не может редактировать enum, может сделать это.

2 голосов
/ 25 марта 2012

Это точное назначение шаблона стратегии .Стратегии здесь - это FileType, которые включают алгоритм, который экспортирует файл.В следующем примере:

public class Application{
 List<FileType> exporters = new ArrayList<FileType>();
 public void addExporter(FileType fileExporter){
  exporters.add(fileExporter);
 }
 public void exportData(Object information){
   for(FileType exporter : exporters){
    exporter.export("d:\Export", information);
   }
 }
}

Класс Application содержит список экспортеров, которые могут быть заполнены на ходу.Класс Application не должен знать, какой тип файла-экспортера зарегистрирован, и как файл может быть экспортирован.Когда данные экспортируются, класс Applicaiton проходит через зарегистрированных экспортеров и делегирует задачу экспорта каждому из них.

РЕДАКТИРОВАТЬ Ниже приведен пример использования класса Application.

// Define a pdf exporter
PdfExport pdfExport = new pdfExport();
Application app = new Application();
// Register the new exporter
app.addExporter(pdfExport);
// Export some data...
app.export(information);

РЕДАКТИРОВАТЬ Как избежать файлов конфигурации и изменить кодкаждый раз, когда у вас есть новый FileType?Вы можете загрузить экспортеры во время выполнения, используя рефлексию (подробности см. По этой ссылке )

1 голос
/ 25 марта 2012

Вы можете использовать отражение для сканирования классов, которые реализуют ваш интерфейс.

Посмотрите на похожий вопрос: Во время выполнения найдите все классы в приложении Java, которые расширяют базовый класс

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