Паттерн Компоновщик


 

Паттерн Компоновщик (Composite) обеспечивает представление иерархий часть-целое, объединяя объекты в древовидные структуры.

Проблема.Очень часто возникает необходимость создавать маленькие компоненты (примитивы), объединять их в более крупные компоненты (контейнеры), более крупные компоненты соединять в большие компоненты, большие компоненты — в огромные и т. д. При этом клиентам приходится различать компоненты-примитивы и компоненты-контейнеры, работать с ними по-разному. Это усложняет приложение. Паттерн Компоновщик позволяет ликвидировать это различие, его можно применять в следующих случаях:

q необходимо построить иерархию объектов вида часть-целое;

q нужно унифицировать использование как составных, так и индивидуальных объектов.

Решение.Ключевым элементом решения является абстрактный класс Компонент, который является одновременно и примитивом, и контейнером. В нем объявлены:

q абстрактная операция примитива Работать( );

q абстрактные операции контейнера — управления примитивами-потомками Добавить(Компонент) и Удалить(Компонент), а также доступа к потомку Получить-Потомка().

Структурная составляющая паттерна Компоновщик представлена на рис. 12.51.

Рис. 12.51. Структурная составляющая паттерна Компоновщик

 

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

Класс Компонент служит простым элементом дерева, класс Компоновщик является рекурсивным элементом, а класс Лист — конечным элементом дерева. Класс Компонент служит родителем классов Лист и Компоновщик. Отметим, что класс Компоновщик является агрегатом составных частей — экземпляров класса Компонент (таким образом задается рекурсия).

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

Результаты. Паттерн определяет иерархии, состоящие из классов-примитивов и классов-контейнеров, облегчает добавление новых разновидностей компонентов. Он упрощает организацию клиентов (клиент не должен учитывать специфику адресуемого объекта). Недостаток применения паттерна — трудность в наложении ограничений на объекты, которые можно включать в композицию.

Обозначение паттерна Компоновщик приведено на рис. 12.52, где показано, что у него три параметра настройки — компонент, компоновщик и лист.

Настройку паттерна на графическое приложение иллюстрирует рис. 12.53.

Рис. 12.52.Обозначение паттерна Компоновщик

 

Рис. 12.53.Настройка паттерна Компоновщик

 

В этом случае основной операцией приложения становится операция Рисовать(). Подразумевается, что такая операция входит в состав каждого из подключаемых классов, то есть классов Рисунок, Прямоугольник и Графический элемент. Операции Рисовать() должны заместить операции Работать() в классах паттерна.

Паттерн Команда

 

Паттерн Команда (Command) выполняет преобразование запроса в объект, обеспечивая:

q параметризацию клиентов с различными запросами;

q постановку запросов в очередь и их регистрацию;

q поддержку отмены операций.

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

q объекты параметризируются действием. В процедурных языках параметризация осуществляется при помощи функции обратного вызова, которая регистрируется для последующего вызова. Паттерн Команда предлагает объектно-ориентированную замену функций обратного вызова;

q необходимо обеспечить отмену операций. Это возможно благодаря хранению истории выполнения операций;

q необходимо регистрировать изменения состояния для восстановления системы в случае аварийного отказа;

q необходимо создание сложных операций, которые строятся на основе примитивных операций.

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

Структурная составляющая паттерна Команда показана на рис. 12.54. Классы этой структуры имеют следующие обязанности:

q Команда объявляет интерфейс для выполнения операции;

q КонкрКоманда определяет связь между экземпляром класса Получатель и действием, реализует Выполнять(), вызывая нужную операцию получателя;

q Клиент создает объект класса КонкрКоманда и устанавливает его получателя;

q Инициатор просит команду выполнить запрос;

q Получатель умеет выполнять запрашиваемые операции.

Рис. 12.54.Структурная составляющая паттерна Команда

 

В качестве конкретной команды могут выступать команда Открыть, команда Вставить. Инициатором может быть Пункт Меню, а получателем — Документ.

Объекты этого паттерна осуществляют следующие взаимодействия:

q клиент создает объект класса КонкрКоманда и задает его получателя;

q объект класса Инициатор сохраняет объект класса КонкрКоманда;

q инициатор вызывает операцию Выполнять() объекта класса КонкрКоманда;

q объект класса КонкрКоманда вызывает операцию своего получателя для исполнения запроса.

Результаты. Применение паттерна Команда приводит к следующему:

q объект, запрашивающий операцию, отделяется от объекта, умеющего выполнять запрос;

q объекты-команды являются полноценными объектами. Их можно использовать и расширять обычным способом;

q из простых команд легко компонуются составные команды;

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

Обозначение паттерна Команда приведено на рис. 12.55, где показано, что у него четыре параметра настройки — клиент, команда, инициатор и получатель.

Рис. 12.55.Обозначение паттерна Команда

 

Настройку паттерна на приложение с графическим меню иллюстрирует рис. 12.56.

Рис. 12.56.Настройка паттерна Команда

 

Очевидно, что в получаемой кооперации конкретный класс Редактор играет роль клиента, классы КомандаОткрыть и КомандаВставить становятся классами Конкретных Команд (и подклассами абстрактного класса Команда), класс ПунктМеню замещает класс Инициатор паттерна, а конкретный класс Документ замещает класс Получатель паттерна.

Бизнес-модели

 

Достаточно часто перед тем, как решиться на заказ ПО, организация проводит бизнес-моделирование. Цели бизнес-моделирования:

q отобразить структуру и процессы деятельности организации;

q обеспечить ясное, комплексное и, главное, одинаковое понимание нужд организации как сотрудниками, так и будущими разработчиками ПО;

q сформировать реальные требования к программному обеспечению деятельности организации.

Для достижения этих целей разрабатываются две модели: Q бизнес-модель Use Case; а бизнес-объектная модель.

Бизнес-модель Use Case задает внешнее представление бизнес-процессов организации (с точки зрения внешней среды — клиентов и партнеров).

Как показано на рис. 12.57, бизнес-модель Use Case строится с помощью бизнес-актеров и бизнес-элементов Use Case — простого расширения средств, используемых в обычных диаграммах Use Case.

Рис. 12.57.Фрагмент бизнес-модели Use Case для аэропорта

 

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

Бизнес-элементы Use Case изображают различные рабочие потоки бизнеса. Последовательности действий в бизнес-элементах Use Case обычно описываются диаграммами деятельности.

Бизнес-объектная модель отражает внутреннее представление бизнес-процессов организации (с точки зрения ее сотрудников).

Как показано на рис. 12.58, бизнес-объектная модель строится с помощью бизнес-работников и бизнес-сущностей — классов со специальными стереотипами. Эти классы имеют специальные графические обозначения.

Рис. 12.58.Фрагмент бизнес-объектной модели аэропорта

 

Бизнес-работник — абстракция человека, действующего в бизнесе. Бизнес-сущности являются «предметами», обрабатываемыми или используемыми бизнес-работниками по мере выполнения бизнес-элемента Use Case. Например, бизнес-сущность представляет собой документ или существенную часть продукта. Фактически бизнес-объектная модель отображается с помощью диаграмм классов.

Контрольные вопросы

 

1. Поясните два подхода к моделированию поведения системы. Объясните достоинства и недостатки каждого из этих подходов.

2. Охарактеризуйте вершины и дуги диаграммы схем состояний. В чем состоит назначение этой диаграммы?

3. Как отображаются действия в состояниях диаграммы схем состояний?

4. Как показываются условные переходы между состояниями?

5. Как задаются вложенные состояния в диаграммах схем состояний?

6. Поясните понятие исторического подсостояния.

7. Охарактеризуйте средства и возможности диаграммы деятельности.

8. Когда не следует применять диаграмму деятельности?

9. Какие средства диаграммы деятельности позволяют отобразить параллельные действия?

10. Зачем в диаграмму деятельности введены плавательные дорожки?

11. Как представляется имя объекта в диаграмме сотрудничества?

12. Поясните синтаксис представления свойства в диаграмме сотрудничества.

13. Какие стереотипы видимости используются в диаграмме сотрудничества? Поясните их смысл.

14. В какой форме записываются сообщения в языке UML? Поясните смысл сообщения.

15. В каком отношении находятся сообщения и действия? Перечислите разновидности действий.

16. Чем отличается процедурный поток от асинхронного потока сообщений?

17. Как указывается повторение сообщений?

18. Как показать ветвление сообщений?

19. Что общего в диаграмме последовательности и диаграмме сотрудничества? Чем они отличаются друг от друга?

20. Как отображается порядок передачи сообщений в диаграмме последовательности?

21. Когда удобнее применять диаграммы последовательности?

22. Из каких элементов состоит диаграмма Use Case?

23. Какие отношения разрешены между элементами диаграммы Use Case?

24. Для чего применяют диаграммы Use Case?

25. Чем отличаются друг от друга отношения включения и расширения с точки зрения управления?

26. Каково назначение спецификации элемента Use Case и как она оформляется?

27. Что такое сценарий элемента Use Case?

28. Как документируется отношение включения?

29. Как документируется отношение расширения?

30. Каков порядок построения модели требований?

31. Каково назначение кооперации? Какие составляющие ее образуют?

32. Могут ли разные кооперации использовать одинаковые классы? Обоснуйте ответ.

33. Что такое паттерн?

34. Чем паттерн отличается от кооперации? Чем они схожи?

35. Как описывается паттерн?

36. Что нужно сделать для применения паттерна?

37. Каковы цели бизнес-моделирования?

38. Из каких частей состоит бизнес-модель? На что похожи эти части? В чем их своеобразие?



Дата добавления: 2016-06-18; просмотров: 2532;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.019 сек.