2010-09-21 4 views
2

Для класса шаблонов проектирования преподаватель попросил мою команду разработать приложение, которое поддерживает рисование и сохраняющиеся глифы, очень похожие на редактор WYSIWYG из GoF.Неправильное использование шаблона Builder?

Моя команда решила использовать слоистую архитектуру с нисходящими слоями: презентация, контроллер, логика, стойкость.

Logic поддерживает коллекцию представлений глифов, их соответствующих позиций и некоторых уникальных свойств. Инструктор предложил использовать шаблон Builder для создания единого механизма сохранения, поскольку CSV и XML необходимы форматы сохранения.

Проблема возникает, когда мы пытаемся спроектировать Builder в слое Persistence. Поскольку мы используем слои, то на уровне Persistence не разрешается явно указывать типы Glyph, не говоря уже о том, чтобы отбросить их из своей абстрактной формы в их отдельные формы. Это заставляет меня почесывать мою голову тем, что даже передать каждому строителю в качестве своего конструктора.

Следующая проблема заключается в том, что трудно обобщить типы, которые берет Builder. Прямоугольники имеют свойства, которые Lines нет.

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

Редактировать: Инструктор не сказал, что мы должны загружать сохраненные форматы обратно. Мое окончательное решение должно, очевидно, сделать это легко, но для моей текущей проблемы я сосредоточен только на сохранении.

ответ

2

Не уверен, что для этого вам нужен строитель. Заводы/Реестры и сериализуемость, вероятно, более точны.

Способ, которым вы накладываете слой persistence, не осведомленный о явных типах глифов, сохраняя при этом возможность сохранять и загружать определенные экземпляры глифов, через какой-то вид отражение механизм. Либо что-то встроенное в язык (например, Reflection in .Net, или RTTI в Delphi/C++ Builder), либо что-то, что вы сами создаете.

Чтобы HANDCRAFT является решением себе, что вы должны будете иметь все виды глифов происходят от общего «сериализуемого» базового типа или иметь их все реализовать «сериализацию» интерфейс. Настойчивость слой должен знать об этом базовом типе или интерфейсе только - в зависимости от того, вы выбираете.

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

«Сериализуемый» базовый тип или интерфейс должен обеспечивать уровень персистентности средствами идентификации типа глифа уникальным (строковым) идентификатором, средством для итерации по свойствам, подлежащим сохранению/загрузке; и средства для создания символа полиморфно (виртуальные конструкторы и мета классы в Delphi говорят).

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

Итерационные свойства должны быть простыми и понятными, но если вы хотите «спроектировать узор», вы можете рассмотреть возможность использования Посетитель.Что может сделать жизнь намного проще, когда составленные и агрегированные глифы (группировка в приложениях рисования) попадают в картину, а каламбур не предназначен :-). В связи с этим вы также можете рассмотреть возможность просмотра шаблона Composite, хотя это может быть излишним для того, что вас попросили сделать.

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

+0

Я в конечном итоге пошел в другом направлении, но это действительно помогло. Отличная почта, и спасибо! – Mike

Смежные вопросы