Вопрос о шаблоне дизайна - PullRequest
       17

Вопрос о шаблоне дизайна

4 голосов
/ 02 февраля 2010

Я разрабатываю приложение и не могу указать правильный дизайн для этого же. У меня есть один в моей голове, но он, кажется, не является частью шаблона GOF, и поэтому я не уверен, что это хороший путь.

Мой проект создает данные из любого из 15-20 документов (все документы одного типа, но данные могут сильно различаться). Как только данные получены, они должны быть отформатированы в любом из поддерживаемых 4 форматов и отображены. Кроме того, чтобы усложнить ситуацию, даже если сами документы широко классифицированы по 4-5 типам, лишь немногие документы (по этим классификациям) форматируются аналогичным образом.

Теперь я разделил это следующим образом:

  • Создание данных
  • Отображение данных

Создание данных создает объект данных интерфейса с общим интерфейсом, который может обрабатывать все эти документы.

Дисплей данных считывает объект данных и отображает его так, как требуется.

Мой первый вопрос: Я не видел такого объекта интерфейса в наборе шаблонов GOF. Это хорошее дизайнерское решение иметь такую ​​вещь?

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

Итак, мой второй вопрос - Как лучше всего с этим справиться?

Я буду очень благодарен, если кто-нибудь сможет мне здесь помочь.

Ответы [ 4 ]

5 голосов
/ 02 февраля 2010

Не пытайтесь толкать слишком сложный паттерн заранее. Выясните несколько дизайнов, а затем попытайтесь выявить паттерны в них. Шаблоны предназначены для общения и могут рассматриваться как повторно используемые только для некоторых конкретных задач.

Итак, ваша общая проблема в том, что у вас есть X документов и Y отрендеренных.

  • Попробуйте создать иерархию классов для документов, которые имеют смысл. Вы, вероятно, можете включить некоторую логику в базовый класс или использовать интерфейс
  • Если вы не можете понять интерфейс для абстрагирования всех типов документов, вы можете положиться на адаптеры для адаптации различных документов к заданному интерфейсу
  • Чтобы иметь несколько рендеров, вы можете взглянуть на шаблон посетитель , шаблон декоратор или шаблон стратегия или использовать просто обычный наследование / полиморфизм с визуализацией Y, реализующей тот же интерфейс. Это зависит от характера вариаций.
  • Чтобы получить правильное средство визуализации в соответствии с вариантом использования, вы можете использовать factory для встраивания логики решения и реализации.

Шаблоны GoF имеют более низкую степень детализации, чем ваша проблема. Вам нужно будет придумать дизайн, который соответствует вашим очень специфическим требованиям. В случае сомнений всегда выбирайте дизайн, который является самым простым / более интуитивным . Нет таких, у кого больше шаблонов и причудливой иерархии классов.

Мои 2 цента

1 голос
/ 02 февраля 2010

Походит на шаблон Стратегии, с общим приложением, являющимся MVC с вырожденным Контроллером.

0 голосов
/ 02 февраля 2010

Задумывались ли вы о шаблоне компоновщика для создания данных

Намерение строителя

Отделите построение сложного объекта от его представления, чтобы один и тот же процесс построения мог создавать разные представления.

для отображения можно использовать разные декораторы

0 голосов
/ 02 февраля 2010

Ваш интерфейсный объект может быть описан с помощью шаблона проектирования Facade или Adapter . Не беспокойтесь слишком сильно, если нет прямого соответствия с существующим шаблоном проектирования - ваше описанное решение - лучший путь.

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

...