Я ищу шаблоны или архитектурное руководство для будущей функции, которую я разрабатываю. По сути, это функция экспорта с несколькими целями экспорта, и я ищу способ сделать его достаточно универсальным, когда подключение новых целей экспорта не требует больших изменений ядра. Что касается целей экспорта, я просто имею в виду различные типы вывода, будь то PDF, презентации PowerPoint, документы Word, RSS и т. Д. У меня есть базовый набор данных, который представлен в JSON и XML. Эти данные используются для построения изображений (с использованием любого числа или типов экспорта [например, PNG, JPG, GIF и т. Д.), Графиков, текстовых представлений, таблиц и многого другого.
Я пытаюсь найти способ абстрагировать весь рендеринг и макет в какой-то механизм рендеринга или макета, который обрабатывает добавление дополнительных целей экспорта. Любая помощь / предложения / ресурсы относительно того, как подойти к этому, будет принята с благодарностью. Заранее спасибо.
Для наглядного представления о том, чего я пытаюсь достичь.
источник
Ответы:
Для меня путь - интерфейсы и фабрика. Тот, который возвращает ссылки на интерфейсы, за которыми могут скрываться различные классы. Все классы, выполняющие фактическую работу, должны быть зарегистрированы в Factory, чтобы он знал, какой класс создать, учитывая набор параметров.
Примечание: вместо интерфейсов вы также можете использовать абстрактные базовые классы, но недостатком является то, что для языков с одним наследованием он ограничивает вас одним базовым классом.
Код в синтаксисе Delphi (Pascal), поскольку это язык, с которым я наиболее знаком.
После того, как все реализующие классы зарегистрированы на фабрике, вы сможете запросить ссылку на интерфейс для экземпляра такого класса. Например:
должен вернуть ссылку IReader на экземпляр TXMLReader; ссылка IWriter на экземпляр TPowerPointWriter и ссылка IRepresentation на экземпляр THTMLTable.
Теперь все, что нужно сделать движку рендеринга, это связать все вместе:
Интерфейс IReader должен предоставлять методы для чтения данных, необходимых разработчикам IRepresentation для построения представления данных. Аналогично, IRepresentation должен предоставлять методы, которые необходимы разработчикам IWriter для экспорта представления данных в запрошенный формат файла экспорта.
Предполагая, что данные в ваших файлах имеют табличную природу, IReader и его поддерживающие интерфейсы могут выглядеть следующим образом:
Итерация по таблице будет тогда вопросом
Поскольку представления могут быть изображениями, графиками и текстовыми по природе, IRepresentation, вероятно, будет иметь методы, аналогичные IReader для обхода построенной таблицы, и будет иметь методы для получения изображений и графиков, например, в виде потока байтов. Реализаторы IWriter могут кодировать значения таблицы и байты изображения / графика, как того требует цель экспорта.
источник
Хотя я согласен с тем, что для размышлений об архитектуре требуется больше информации, наиболее простой способ создания объектов различного типа, которые ведут себя одинаково (т. Е. Все они генерируют выходные данные), использует шаблон фабрики. Больше информации здесь
источник
Вы могли бы закончить с чем-то вроде этого.
Две фабрики основаны вокруг:
1 - для преобразования типа ввода (Json / XML) в конкретную реализацию того, как преобразовать эти данные в изображение / график
2 - Вторая фабрика для принятия решения о том, как визуализировать вывод в документ Word / PDF Document
Полиморфизм использует общий интерфейс для всех визуализированных данных. Таким образом, изображение / таблица может быть перемещена как простой интерфейс.
1 - Фабрика для преобразования данных JSON / XML в конкретную реализацию:
Фабрика ниже позволяет вам преобразовать данные XML или Json Data в правильный конкретный тип.
Конкретные реализации выполняют всю тяжелую работу по преобразованию данных в соответствующий тип. Они также преобразуют данные в интерфейс IConvertedData, который используется для полиморфизма.
Вы можете добавлять эти реализации по мере необходимости, по мере расширения вашего кода.
Интерфейс IConvertedData позволяет передавать один тип в следующую фазу: ПРИМЕЧАНИЕ. Возможно, вы не возвращаете пустоты здесь. Это можно сделать с помощью байта [] для изображений или документа OpenXml для WordDocument. Отрегулируйте по необходимости.
Полиморфизм:
Это используется для преобразования данных в соответствующий тип вывода. то есть рендеринг в PDF для данных изображения, может отличаться от данных рендеринга изображения для PowerPoint.
2 - Фабрика, чтобы решить выходной формат:
Каждая конкретная реализация предоставляет общий метод, который маскирует возвращение экспорта в реализации IConvertedData.
Пример клиента для всего этого будет:
источник
Мы решили аналогичную проблему здесь: https://ergebnisse.zensus2011.de/?locale=en Там у нас есть в основном «таблицы» и «графики» для экспорта в различные форматы: pdf, excel, web. Наша идея заключалась в том, чтобы указать каждый объект, который будет отображаться как собственный класс Java с интерфейсами для создания и чтения этих классов. В вашем случае будет 2 реализации для каждого объекта для создания (xml, json) и 4 реализации для рендеринга (чтения).
Пример: вам понадобятся некоторые классы для таблиц: Таблица классов (обрабатывает структуру таблицы, проверку и содержимое). Интерфейс CreateTable (предоставляет данные таблицы, ячейки, интервалы, содержимое). Интерфейс ReadTable (получатель для всех данных).
Возможно, вам не нужны интерфейсы (или только один), но я думаю, что это всегда обеспечивает хорошую развязку, особенно полезную при тестировании.
источник
Я думаю, что вы ищете шаблон стратегии . У вас есть множество классов для вывода данных в нужном формате, и вы просто выбираете подходящий во время выполнения. Добавление нового формата должно быть таким же простым, как добавление другого класса, реализующего необходимый интерфейс. Я часто делал это в Java, используя Spring, чтобы просто поддерживать карту конвертеров с ключами по типу формата.
Как уже упоминалось, это обычно достигается тем, что все классы реализуют один и тот же интерфейс (или происходят из одного базового класса) и выбирают реализацию через фабрику.
источник