patterns-for

advertisement
Паттерны в архитектуре SMaC-Metro
см. диаграммы классов UML вот тут: patterns-for-smac.zargo
Model-View-Controller (Модель-Вид-Контроллер) либо Document-View
(Документ-Вид) + Observer (наблюдатель)
=MVC=
Объяснение
Архитектура «Модель-Вид-Контроллер» обеспечивает гибкое двустороннее
взаимодействие пользовательского интерфейса и внутреннего представления некоторой
структуры данных.
Предложения
Интерфейс пользователя (Вид) = графическое представление карты MetroMap
Внутреннее представление (Модель) = сеть Петри petri_net
Контроллер (обеспечивает взаимодействие) = контроллер карты MapController.
преобразует изменения сети Петри в изменения карты, и наоборот.
=Observer=
Объяснение
Позволяет одним объектам подписываться на (attach) и получать оповещения об
изменении состояния других объектов (onChange). Можно также отписаться (detach).
Предложения
У нас будет меняться визуальное представление (карта) и модель (сеть Петри). Чтобы
синхронизировать одно с другим, используется контроллер карты.
наблюдаемые объекты — сеть Петри (модель), графическое представление сети Петри
(карта)
наблюдатель — контроллер карты (MapController)
Singleton (одиночка)
Объяснение
Singleton — это класс, который существует в единственном экземпляре.
Статический метод instance() возвращает указатель на этот экземпляр.
Предложения
Карта метрополитена MetroMap (по условию она единственная), контроллер карты
MapController:
Composite (компоновщик)
Объяснение
Composite — это класс, предназначенный для единообразного представления как
индивидуальных, так и составных объектов.
Компонующий класс имеет методы add, remove, children для добавления, удаления и
получения списка составляющих его компонентов соответственно.
Удобное добавление: add() и remove() определены как защищенные (protected) и
вызываются из конструктора и деструктора соответственно.
Предложения
- Карта метро MetroMap, перегон Span, участок пути Path, светофор Semaphore
(графические элементы карты метро).
Карта состоит из станций и перегонов, перегоны состоят из нескольких участков пути и
светофоров.
- Сама карта.
Command (команда)
Объяснение
Позволяет представить команды пользовательского интерфейса и программы, которые
модифицируют редактируемый документ. У команды есть инициатор — вызывающая
сторона (например, элемент меню) и исполнитель (класс, выполняющий указанное
действие).
Предложения
Команды редактирования карты и добавления элементов на карту, команда сохранения
карты, прочие команды меню и панели инструментов.
В нашем случае инициатором команд могут служить элементы меню (MenuItem) и кнопки
палитры (PaletteItem), а исполнителем — класс контроллера карты (MapController). Такая
реализация позволяет добиться синхронности модели (сети Петри petri_net) и вида
(визуального представления карты MetroMap).
Например, конкретная команда палитры ConcretePaletteItem вызывает команду actionX()
контроллера:
Iterator (итератор)
Объяснение
Маленький объект, содержащий информацию о некотором месте в контейнере, и
позволяющий перемещаться по контейнеру и модифицировать в нем данные.
Предложения
Итераторы по сети Петри, обеспечивающие обход графа в ширину (в глубину?), обход по
отдельности переходов и позиций. В традиции STL имена можно дать следующие:
 begin()/end() — итераторы, стоящие на начале/конце всего графа;
 tbegin/tend — аналогично по всем переходам (transitions)
 pbegin/pend — аналогично по всем позициям (positions)
Decorator (Декоратор)
Объяснение
Позволяет расширять стандартную функциональность классов (как правило,
обеспечивающих графический интерфейс).
Пример из Википедии:
Предложение
Если нам понадобится каким-то образом расширить графический интерфейс, то это
разумнее всего сделать путем «навешивания» декоратора (декораторов), обеспечивающих
дополнительную функциональность.
Сериализация
Это не паттерн проектирования, но полезная штука. (Есть похожий паттерн, называется
Memento (хранитель). Он позволяет получать «мгновенные снимки» класса и
восстанавливать состояние класса по мгновенному снимку.)
Предложение
boost::serialization умеет сохранять классы, использующие STL-контейнеры. Для этого
надо минимум кода (реализовать метод serialize и писать/читать сериализованные данные
используя стандартный ввод/вывод C++).
http://www.boost.org/doc/libs/1_46_1/libs/serialization/doc/index.html
Related documents
Download