Шаблон «Компоновщик» Composite.



Название и классификация паттерна

Декоратор - паттерн, структурирующий объекты.

Назначение

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

Применимость

- Необходимо объединять группы схожих объектов и управлять ими.

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

- Код клиента работает с примитивными и составными объектами единообразно.

Структура

Паттерн Composite предлагает следующее решение. Он вводит абстрактный базовый класс Component с поведением, общим для всех примитивных и составных объектов. Подклассы Primitive and Composite являются производными от класса Component. Составной объект Composite хранит компоненты-потомки абстрактного типа Component, каждый из которых может быть также Composite.

Результаты

- В систему легко добавлять новые примитивные или составные объекты, так как паттерн Composite использует общий базовый класс Component.

- Код клиента имеет простую структуру – примитивные и составные объекты обрабатываются одинаковым образом.

- Паттерн Composite позволяет легко обойти все узлы древовидной структуры

- Неудобно осуществить запрет на добавление в составной объект Composite объектов определенных типов.

 

Шаблон «Наблюдатель» Observer

Название и классификация паттерна

Наблюдатель - паттерн поведения объектов.

Назначение

Определяет зависимость типа «один ко многим» между объектами таким образом, что при изменении состояния одного объекта все зависящие от него оповещаются об этом и автоматически обновляются.

Применимость

Используйте паттерн наблюдатель в следующих ситуациях:

· когда у абстракции есть два аспекта, один из которых зависит от другого. Инкапсуляции этих аспектов в разные объекты позволяют изменять и повторно использовать их независимо;

· когда при модификации одного объекта требуется изменить другие и вы не знаете, сколько именно объектов нужно изменить;

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

Структура

Участники

· Subject- субъект: - располагает информацией о своих наблюдателях. За субъектом может «следить» любое число наблюдателей; - предоставляет интерфейс для присоединения и отделения наблюдателей;

· Observer- наблюдатель: - определяет интерфейс обновления для объектов, которые должны быть уведомлены об изменении субъекта;

· ConcreteSubject- конкретный субъект: - сохраняет состояние, представляющее интерес для конкретного наблюдателя ConcreteObserver; - посылает информацию своим наблюдателям, когда происходит изменение;

· ConcreteObserver- конкретный наблюдатель: - хранит ссылку на объект класса ConcreteSubject; - сохраняет данные, которые должны быть согласованы с данными субъекта; вп- реализует интерфейс обновления, определенный в классе Observer, чтобы поддерживать согласованность с субъектом.

Отношения

· объект ConcreteSubject уведомляет своих наблюдателей о любом изменении, которое могло бы привести к рассогласованности состояний наблюдателя и субъекта;

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

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

Результаты

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

Рассмотрим некоторые достоинства и недостатки паттерна наблюдатель:

· абстрактная связанность субъекта и наблюдателя. Субъект имеет информацию лишь о том, что у него есть ряд наблюдателей, каждый из которых подчиняется простому интерфейсу абстрактного класса Observer. Субъекту неизвестны конкретные классы наблюдателей. Таким образом, связи между субъектами и наблюдателями носят абстрактный характер и сведены к минимуму.

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

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

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

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

 


Дата добавления: 2018-06-01; просмотров: 352; Мы поможем в написании вашей работы!

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






Мы поможем в написании ваших работ!