Фрагмент для ознакомления
2
Допустим, нужно организовать линию связи между каждым жителем города. Как вариант, можно просто протянуть кабель от одного дома жителя к другому. Но масштабироваться такая система будет очень плохо, для добавления одного нового жителя к сети потребуется снова протягивать кабель к каждому старому. Чинить обрывы будет тоже не самой простой задачей.
Здесь пригодится паттерн «Одиночка». Одиночкой в этом случае будет телефонная станция, и все линии связи будут проходить через нее. Для добавления нового жителя потребуется только протянуть кабель от его дома до станции.
Но главное в одиночке то, что, создав станцию один раз, ей может пользоваться сколько угодно людей. Смысл в том, что, когда вы скажете: «Мне нужна телефонная станция», вам ответят не «Нужно строить новую станцию», а «Она находится там-то».
3. Структурные паттерны
Другая группа паттернов - структурные паттерны - рассматривает, как классы и объекты образуют более крупные структуры - более сложные по характеру классы и объекты . К таким шаблонам относятся:
1. Адаптер (Adapter)
Пусть у нас есть один или несколько классов со сходным функционалом, но совершенно различным интерфейсом. Необходимо избавиться от привязки к конкретному классу, введя один общий интерфейс для этих классов. Вся работа по «пересказу» вызовов общего интерфейса со стороны клиента в конкретные обращения к интерфейсу обёрнутого класса ложится на класс адаптера.
Плюсом паттерна является то, что он позволяет повторно использовать уже имеющийся код, адаптируя его несовместимый интерфейс к виду, пригодному для использования .
Минус же в том, что задача преобразования интерфейсов может оказаться непростой в случае, если клиентские вызовы и (или) передаваемые параметры не имеют функционального соответствия в адаптируемом объекте.
2. Мост (Bridge)
Назначение паттерна: отделить абстракцию от ее реализации так, чтобы и то, и другое можно было изменять независимо. Паттерн правильно применять, когда у нас несколько абстракций и несколько реализаций. Реализуется паттерн с помощью указателя на базовый класс иерархии реализаций в классах абстракций.
Например, у нас есть иерархия классов «автомобили»: легковой, грузовой, автобус. И есть варианты реализации каждой машины: модель, тестовый прототип, серийное производство. Для реализации паттерна моста в этом примере необходимо в базовом классе автомобилей добавить поле для хранения указателя на тип реализации, значение которого класс будет получать в своём конструкторе, и вызывать по необходимости методы вложенного объекта.
3. Компоновщик (Composite)
Проблема: необходимо управлять множеством объектов, которые могут быть как составными, так и простыми. При этом хочется сохранить некоторый общий интерфейс для работы с любым из этих объектов.
Паттерн Composite используется если :
-Необходимо объединять группы схожих объектов и управлять ими.
-Объекты могут быть как примитивными (элементарными), так и составными (сложными). Составной объект может включать в себя коллекции других объектов, образуя сложные древовидные структуры. Пример: директория файловой системы состоит из элементов, каждый их которых также может быть директорией.
-Код клиента работает с примитивными и составными объектами единообразно.
4. Декоратор (Decorator)
Цель: добавить новые обязанности в поведении или состоянии отдельных объектов во время выполнения программы. Использование наследования не представляется возможным, поскольку это решение статическое и распространяется целиком на весь класс.
Реализация: выделить общий интерфейс для декораторов и декорируемого объекта. Реализовать класс декоратора, который реализует этот интерфейс и хранит в себе указатель на декорируемый объект.
Каждая реализация метода интерфейса в декораторе вызывает аналогичную функцию в обёртываемом объекте и потом модифицирует результат. В отличие от адаптера, данный паттерн не изменяет интерфейс декорируемого объекта, а расширяет его функциональность .
5. Фасад (Facade)
Назначение паттерна Facade:
-Паттерн Facade предоставляет унифицированный интерфейс вместо набора интерфейсов некоторой подсистемы. Facade определяет интерфейс более высокого уровня, упрощающий использование подсистемы.
-Паттерн Facade «обертывает» сложную подсистему более простым интерфейсом. Решаемая проблема: клиенты хотят получить упрощенный интерфейс к общей функциональности сложной подсистемы.
Паттерн Facade инкапсулирует сложную подсистему в единственный интерфейсный объект. Это позволяет сократить время изучения подсистемы, а также способствует уменьшению степени связанности между подсистемой и потенциально большим количеством клиентов . С другой стороны, если фасад является единственной точкой доступа к подсистеме, то он будет ограничивать возможности, которые могут понадобиться «продвинутым» пользователям.
6. Приспособленец (Flyweight)
Проблема: есть большое количество мелких объектов, которые дают большие накладные расходы при использовании. Хочется уменьшить издержки.
Идея: определить, что в классе обязательно необходимо хранить внутри него, а что можно вынести наружу и передавать из клиента как аргументы метода при вызове .
7. Заместитель (Proxy)
Класс Proxy реализует тот же интерфейс, что и оборачиваемый им объект, управляя обращениями к вложенному объекту. Особенности паттерна Proxy:
-Adapter предоставляет своему объекту другой интерфейс. Proxy предоставляет тот же интерфейс. Decorator предоставляет расширенный интерфейс.
Фрагмент для ознакомления
3
Список литературы
1. Александреску, А. Современное проектирование на C++. Обобщённое программирование и прикладные шаблоны проектирования / А. Александреску. - М., 2016. - 344 c.
2. Боровский, А. C++ и Pascal в Kylix 3. Разработка интернет-приложений и СУБД / А. Боровский. - М.: БХВ-Петербург, 2015. - 544 c.
3. Вендров А.М. Проектирование программного обеспечения экономических информационных систем: Учебник. - М. Финансы и статистика, 2013. -352с
4. Гамма Э. Приемы объектно-ориентированного проектирования. Паттерны проектирования. / Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссидес. – СПб.: Питер, 2011. – 368 с.
5. Давыдов, В. Visual C++. Разработка Windows-приложений с помощью MFC и API-функций / В. Давыдов. - М.: БХВ-Петербург, 2014. - 576 c.
6. Ларман К. Применение UML и шаблонов проектирования / К. Ларман. – М.: «Вильямс», 2012. – 496 с.
7. Мисюра М. А. Шаблоны проектирования GoF. Структурные шаблоны. Адаптер и декоратор // Молодой ученый. — 2017. — №4. — С. 172-174.
8. Поляков, А. Методы и алгоритмы компьютерной графики в примерах на Visual C++ / А. Поляков, В. Брусенцев. - М.: БХВ-Петербург, 2014. - 560 c.
9. Понамарев, В. Программирование в Visual Studio. NET 2003 / В. Понамарев. - М.: БХВ-Петербург, 2015. - 917 c.
10. Роберт, С. Сикорд Безопасное программирование / Роберт С. Сикорд. - Москва: РГГУ, 2014. - 496 c.
11. Секунов, Н. Программирование на C++ в Linux / Н. Секунов. - М.: БХВ-Петербург, 2016. - 425 c.
12. Филд, А. Функциональное программирование / А. Филд, П. Харрисон. - М.: 2016. - 845 c.
13. Фримен, Эрик Паттерны проектирования / Эрик Фримен и др. - М.: Питер, 2015. - 656 c.