вторник, 28 апреля 2009 г.

28.04.09. Design Patterns. Абс. фабрика, адаптер, цепочка, команда, target-action, композит, делегат

How Cocoa Adapts Design Patterns

Два основных паттерна в Cocoa: “The Model-View-Controller Design Pattern” and “Object Modeling.”

Abstract Factory

Разновидность фабрики реализуется через Class Cluster.

Adapter

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

Интерфейс - как способ  скрыть конкретный класс.

Chain of Responsibility

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

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

Цепочек может быть несколько, но только одна из них может быть активной.

Для организации объектов цепочки нужно использовать базовый класс NSResponder.

Command

Содержит запрос к объекту. Может включать несколько действий, которые должен будет выполнить получатель сообщения с этой командой.

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

The Target-Action Mechanism

Элемент управления (кнопка и т.п.) может послать сообщение целевому объекту (обычно контроллеру), в результате которого будет выполнено некоторое действие. Действие определяется селектором. Объект Cell элемента управления объединяет целевой объект и действие, т.е. обработчик сообщения. Элемент управления размещен в ячейке.

Composite

Используется в MVC при построении View. Корневым элементом является NSWindow. В нем находится Content View, прозрачная область покрывающая всю внутренную часть окна.



В итоге все View образуют иерархию представлений. Сообщение, отправленное представлению, также доходит и до его дочерних представлений.

Представление имеет две рамки: внешнюю frame и внутренню bounds.

Frame определяет положение представления относительно родительского представления.

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

Decorator

Воплощает принцип: класс должен быть открыт для расширения, но закрыт для изменения.

Delegation

Первый способ расширить класс (добавить поведение) без создания подкласса.

Хост-объект содержит ссылку на объект-делегат. Сам хост-объект умеет выполнять некоторую операцию обобщенно, что приводит к тому, что реальные действия по этой операции выполняет объект-делегат.

Хост-объект - обычно класс фреймворка. Делегирование - способ конкретизировать поведение такого класса без создания подкласса.

Делегат в Cocoa должен реализовывать методы формального или неформального протокола хост-класса. Хост-класс, прежде, чем отправить сообщение делегату, проверяет наличие метода с помощью respondsToSelector:.

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

Делегирование предпочтительнее созданию подкласса, если у делегирующего класса есть нужные методы для реализации делегатом.

Делегат может быть только один. Если нужно, чтобы о событиях в хост-классе уведомлялись несколько объектов, то нужно использовать механизм уведомлений (notifications).

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

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