среда, 29 апреля 2009 г.

29.04.09. Design Patterns. Категории, фасад, итератор, медиатор

Categories

Категории являются еще одним способом расширить класс (только добавить поведение) без создания подкласса.

Этим способом можно также сгруппировать близкие по смыслу методы.

Категории добавляются к классу на этапе компиляции.

Facade

Предоставляет удобный доступ к подсистемам.

Пример: NSImage, который содержит несколько вариантов представлений изображений, которые автоматически выбираются в зависимости от разрешения и т.п.

Iterator

Перекладывает ответственность по работе с элементами коллекций с самих коллекций на специальные объекты-итераторы. Структура коллекции скрывается от клиента.

Производные от NSEnumerator классы задают поведение итератора для различных коллекций.

NSArray, NSSet, and NSDictionary имеют метод, возвращающий подходящий итератор. Работа с любым итератором задается методами NSEnumerator. Например, для получения очередного элемента нужно отправить сообщение nextObject.

Mediator

Централизует взаимодействие объектов. Объекты начинают общаться не напрямую, а через посредника. Это позволяет менять способ взаимодействия объектов и посредника так, что изменения, касающиеся одного объекта, не затрагивают других.

Контроллеры являются посредниками в MVC.

Контроллеры-медиаторы (производные от NSController) перенаправляют запросы от представления к модели. Поддерживают технологию привязок (bindings) элементов интерфейса к объектам модели. Экземпляры таких контроллеров доступны через IB и поэтому доступны для повторного использования.

NSObjectController - для управления одиночным объектом из модели.

NSArrayController - для управления набором объектов модели. Управляет выбором, добавлением и удалением.

NSTreeController - для управления иерархической структурой объектов модели.

NSUserDefaultsController - для управления настройками.

Контроллеры-координаторы централизуют взаимодействие между объектами. Обычно производны от NSWindowController или NSObject. Являются делегатами классов из фреймворка и целями (targets) для сообщений-действий. Из-за реализации под конкретную программу не взаимозаменяемы.

Без контроллеров-медиаторов связать можно любую пару объектов, если они реализуют неформальные протоколы NSKeyValueCoding and NSKeyValueObserving. Но лучше использовать явного посредника, производного от NSController.

Задачи координирующих контроллеров, решаемые через IB:

  • управляют outlets между объектами модели и объектами представления,
  • являются целями в схеме target-action, сообщения-действия инициируются элементами пользовательского интерфейса,
  • являются делегатами для классов фреймворка.

Все эти связи сохранются в nib-файл.

Комментариев нет:

Отправить комментарий