Слайд 2В прошлой серии…
Порождающие паттерны GoF
Singleton
Factory Method
Abstract Factory
Builder
Prototype
Слайд 3Структурные паттерны
Adapter (Адаптер)
Bridge (Мост)
Composite (Компоновщик)
Decorator (Декоратор)
Facade (Фасад)
Flyweight (Приспособленец)
Proxy (Заместитель)
Слайд 4Adapter
Адаптер преобразует интерфейс одного класса в интерфейс другого, который ожидают клиенты. Адаптер
обеспечивает совместную работу классов с несовместимыми интерфейсами, которая без него была бы невозможна (пример: создание текстового элемента в графическом редакторе)
Слайд 5Bridge
Необходим для отделения абстракции от ее реализации так, чтобы то и другое
можно было изменять независимо. Применяется, когда и абстракции, и реализации должны расширяться новыми подклассами. В таком случае паттерн мост позволяет комбинировать разные абстракции и реализации и изменять их независимо.
Слайд 7Особенности
отделение реализации от интерфейса. Реализация больше не имеет постоянной привязки к интерфейсу.
Реализацию абстракции можно конфигурировать во время выполнения. Объект может даже динамически изменять свою реализацию
повышение степени расширяемости. Можно расширять независимо иерархии классов Abstraction и Implementor
Слайд 8Composite
Компонует объекты в древовидные структуры для представления иерархий часть-целое. Позволяет клиентам единообразно
трактовать индивидуальные и составные объекты
Слайд 9Decorator
Динамически добавляет объекту новые обязанности. Является гибкой альтернативой порождению подклассов с целью
расширения функциональности.
Слайд 10Особенности
паттерн декоратор позволяет более гибко добавлять объекту новые обязанности, чем было бы
возможно в случае статического (множественного) наследования
позволяет избежать перегруженных функциями классов на верхних уровнях иерархии. Декоратор разрешает добавлять новые обязанности по мере необходимости вместо того чтобы пытаться поддержать все мыслимые возможности в одном сложном, допускающем разностороннюю настройку классе
декоратор действует как прозрачное обрамление. Но декорированный компонент все же не идентичен исходному.
Слайд 11Facade
Предоставляет унифицированный интерфейс вместо набора интерфейсов некоторой подсистемы. Фасад определяет интерфейс более
высокого уровня, который упрощает использование подсистемы.
Применяется для упрощения работы со сложной системы. Фасад позволяет определить одну точку взаимодействия между клиентом и системой, чем уменьшает количество зависимостей.
Слайд 13Flyweight
Шаблон проектирования, который позволяет использовать разделяемые объекты сразу в нескольких контекстах. Приспособленцы
не могут делать предположений о контексте, в котором работают.
Применим когда:
в приложении используется большое число очень схожих экземпляров заданного класса;
часть состояния объекта является контекстной и может быть легко вынесена во внешние структуры;
после вынесения части состояния, все экземпляры становятся одинаковыми и это дает возможность заменить их одним;
приложение не проверяет идентичность объектов, т.к. в этом случае все якобы самостоятельные экземпляры являются одним объектом.
Слайд 15Особенности
При использовании приспособленцев не исключены затраты на передачу, поиск или вычисление внутреннего
состояния, особенно если раньше оно хранилось как внутреннее. Однако такие расходы с лихвой компенсируются экономией памяти за счет разделения объектов-приспособленцев
Паттерн приспособленец часто применяется вместе с компоновщиком для представления иерархической структуры в виде графа с разделяемыми листовыми узлами.
Слайд 16Proxy
Прокси является суррогатом другого объекта и контролирует доступ к нему.
Слайд 17Паттерны поведения
Chain of responsibility (Цепочка обязанностей )
Command (Команда)
Interpreter (Интерпретатор)
Iterator (Итератор)
Mediator (Посредник)
Memento (Хранитель)
Observer (Наблюдатель)
State (Состояние)
Strategy (Стратегия)
Template method (Шаблонный метод)
Visitor (Посетитель)
Слайд 18Chain of responsibility
Паттерн позволяет избежать привязки отправителя запроса к его получателю, давая
шанс обработать запрос нескольким объектам. Связывает объекты-получатели в цепочку и передает запрос вдоль этой цепочки, пока его не обработают
Слайд 19Особенности
ослабление связанности. Этот паттерн освобождает объект от необходимости знать, кто конкретно обработает
его запрос
дополнительная гибкость при распределении обязанностей между объектами. Цепочка обязанностей позволяет повысить гибкость распределения обязанностей между объектами. Добавить или изменить обязанности по обработке запроса можно, включив в цепочку новых участников или изменив ее каким-то другим образом.
получение не гарантировано
Слайд 20Command
Инкапсулирует запрос как объект, позволяя тем самым задавать параметры клиентов для обработки
соответствующих запросов, ставить запросы в очередь или протоколировать их, а также поддерживать отмену операций
Слайд 21Особенности
команда разрывает связь между объектом, инициирующим операцию, и объектом, имеющим информацию о
том, как ее выполнить
команды - это самые настоящие объекты. Допускается манипулировать ими и расширять их точно так же, как в случае с любыми другими объектами
Из простых команд можно собирать составные (например макросы в текстовых редакторах). В общем случае составные команды описываются паттерном компоновщик
добавлять новые команды легко, поскольку никакие существующие классы изменять не нужно
Слайд 22Interpreter
Паттерн определяет представление грамматики для заданного языка и интерпретатор предложений этого языка.
Как правило, данный шаблон проектирования применяется для часто повторяющихся операций.
Слайд 24Особенности
грамматику легко изменять и расширять
сложные грамматики трудно сопровождать
добавление новых способов интерпретации выражений
(например, вывод в строковом виде)
Слайд 25Iterator
Предоставляет абстрактный интерфейс для последовательного доступа ко всем элементам составного объекта без
раскрытия его внутренней структуры
Слайд 27Mediator
Определяет объект, инкапсулирующий способ взаимодействия множества объектов. Посредник обеспечивает слабую связанность системы,
избавляя объекты от необходимости явно ссылаться друг на друга и позволяя тем самым независимо изменять взаимодействия между ними
Слайд 28Memento
Позволяет выносить внутреннее состояние объекта за его пределы для последующего возможного восстановления
объекта без нарушения принципа инкапсуляции
Слайд 29Observer
Определяет зависимость типа «один ко многим» между объектами таким образом, что при
изменении состояния одного объекта все зависящие от него оповещаются об этом и автоматически обновляются
Слайд 30Особенности
абстрактная связанность субъекта и наблюдателя. Субъект имеет информацию лишь о том, что
у него есть ряд наблюдателей, каждый из которых подчиняется простому интерфейсу абстрактного класса Observer. Субъекту неизвестны конкретные классы наблюдателей. Таким образом, связи между субъектами и наблюдателями носят абстрактный характер и сведены к минимуму.
поддержка широковещательных коммуникаций. В отличие от обычного за-проса для уведомления, посылаемого субъектом, не нужно задавать определенного получателя. Уведомление автоматически поступает всем подписавшимся на него объектам.
Поскольку наблюдатели не располагают информацией друг о друге, им неизвестно и о том, во что обходится изменение субъекта. Безобидная, на первый взгляд, операция над субъектом может вызвать целый ряд обновлений наблюдателей и зависящих от них объектов.
Слайд 31State
позволяет объекту варьировать свое поведение в зависимости от внутреннего состояния. Извне создается
впечатление, что изменился класс объекта
Слайд 32Особенности
локализует зависящее от состояния поведение и делит его на части, соот-ветствующие состояниям.
Паттерн состояние помещает все поведение, ассоциированное с конкретным состоянием, в отдельный объект. Поскольку зависящий от состояния код целиком находится в одном из подклассов класса State, то добавлять новые состояния и переходы можно просто путем порождения новых подклассов
делает явными переходы между состояниями. Если объект определяет свое текущее состояние исключительно в терминах внутренних данных, то пере-ходы между состояниями не имеют явного представления; они проявляются лишь как присваивания некоторым переменным. Ввод отдельных объектов для различных состояний делает переходы более явными.
объекты состояния можно разделять. Если в объекте состояния State от-сутствуют переменные экземпляра, то есть представляемое им состояние кодируется исключительно самим типом, то разные контексты могут разде-лять один и тот же объект State.
Слайд 33Strategy
Определяет семейство алгоритмов, инкапсулирует каждый из них и делает их взаимозаменяемыми. Стратегия
позволяет изменять алгоритмы независимо от клиентов, которые ими пользуются.
Слайд 34Особенности
альтернатива порождению подклассов. При наследовании реализации алгоритма и контекста смешиваются, что затрудняет
понимание, сопровождение и расширение контекста. Кроме того, заменить алгоритм динамически уже не удастся.
с помощью стратегий можно избавиться от условных операторов
клиенты должны знать о различных стратегиях. Т.е. паттерн стоит применять лишь тогда, когда различия в поведении имеют значение для клиента
в отдельных случаях контекст создаст и проинициализирует параметры, которые не нужны более простым алгоритмам
Слайд 35Template Method
шаблонный метод определяет основу алгоритма и позволяет подклассам переопределить некоторые шаги
алгоритма, не изменяя его структуру в целом
Слайд 36Visitor
Описывает операцию, выполняемую с каждым объектом из некоторой структуры. Паттерн посетитель позволяет
определить новую операцию, не изменяя классы этих объектов.