Надо обязательно вспомнить что такое ООП.
Можно почитать: Что такое шаблоны проектирования?
Паттерн(шаблон) проектирования (рассматриваем только вариант для программирования) - способ организации программного кода, представляющего собой решение некоторой часто возникающей проблемы проектирования.
Паттерны проектирования:
Обеспечивают механизмы инстанцирования, облегчая создание объектов способом, который наиболее соответствует ситуации.
В общем случае, имеют дело с отношениями между объектами, облегчая их совместную работу.
Используются в коммуникации между объектами, делая её более лёгкой и гибкой.
Основные примеры:
Основная цель отделить процесс создания объектов от основной логики.
Цель:
Создание интерфейса, который создаёт объект. При этом, выбор того, экземпляр какого класса создавать остаётся за классами, которые имплементируют данный интерфейс.
Для чего используется:
Для делигирования создания экземпляров, другому классу.
Пример использования:
Цель:
Создание интерфейса, для создания множества взаимосвязанных или взаимозависимых объектов, без жёсткой привязке к конкретным классам.
Для чего используется:
Для создания множеств взаимосвязанных объектов.
Пример использования:
Цель:
Гарантировать, что у класса будет только один единственный экземпляр и к нему будет предоставлена глобальная точка доступа.
Для чего используется:
Для создания единственного экземпляра определённого класса.
Пример использования:
Цель:
Отделить конструирование сложного объекта от его представления таким образом, чтобы в результате одного и того же конструирования мы могли получить разные представления.
Для чего используется:
Для создания различных объектов из одного набора данных.
Пример использования:
Цель:
Определить вид создаваемых объектов с помощью экземпляра - прототипа и создавать новые объекты, копируя этот прототип.
Для чего используется:
Для создания копий заданного объекта.
Пример использования:
Цель:
Преобразование интерфейса одного класса в интерфейс того класса, который необходим клиенту.
Для чего используется:
Для обеспечения совместной работы классов, интерфейсы которых не совместимы.
Пример использования:
Цель:
Отделить абстракцию от её реализации таким образом, чтобы мы могли изменять независимо друг от друга и то и другое.
Для чего используется:
Для получения преимуществ наследования без потери гибкости.
Пример использования:
Цель:
Скомпонировать объекты в структуры по типу "дерева", позволяя клиентам единообразно трактовать отдельные и составные объекты.
Для чего используется:
Для группировки мелких компонентов в более крупные, которые, в свою очередь, могут стать основой для ещё более крупных стуктур.
Пример использования:
Цель:
Динамическое добавление новых обязанностей объекту.
Для чего используется:
Используется в качестве альтернативы порождению подклассов для расширения функциональности.
Пример использования:
Цель:
Предоставить унифицированный интерфейс вместо нескольких интерфейсов подститсемы.
Для чего используется:
Используется для опредления интерфейса высокого уровня, который упрощает использование подсистемы.
Пример использования:
Цель:
Поддержка множества мелких объектов.
Для чего используется:
Использует разделение для того, чтобы поддерживать много мелких объектов.
Пример использования:
Цель:
Для замещения другого объекта и контроля доступа к нему.
Для чего используется:
Для обеспечения контроля досутпа к опредленному объекту.
Пример использования:
удалённое замещение | локалный представитель вместо объекта в другом адресном пространстве |
виртуальное замещение | создание "тяжёлых объектов" при необходимости |
защищённое замещение | контроль доступа к указанному объекту |
"умная" ссылка | замена обычного указателя (подсчёт числа ссылок, установка блокировки ит.д.) |
Цель:
Связывание объектов-получателей в цепочку и передача запроса по ней.
Для чего используется:
Помогает избежать привязки отправителя запроса к его получателю, что даёт возможность обработать данный запрос нескольким объектам.
Пример использования:
Цель:
Инкапсулирование запроса в объект.
Для чего используется:
Чтобы задать параметры клиентов для обработки определённых запросов, создание очереди из этих запросов или их контроля и поддержки отмены операций.
Пример использования:
Цель:
Определение представления грамматики объекта.
Для чего используется:
Используется для определения представления грамматики заданного языка и интерпретации его предложений.
Пример использования:
Цель:
Получение последовательного доступа ко всем элементам составного объекта.
Для чего используется:
Для получения последовательного доступа ко всем элементам составного объекта, скрывая его внутреннее представление.
Пример использования:
Цель:
Инкапсуляция способа взаимодейтсвия множества объектов.
Для чего используется:
Для определения объекта, который инкапсулирует способ взаимодействия множества объектов и обеспечения слабой связи между этими объектами.
Пример использования:
Цель:
Сохранить внутренне состояние объекта за его пределы.
Для чего используется:
Фиксирование внутреннего состояния объекта за его пределами не нарушая инкапсуляцию и восстановления объекта в случае необходимости.
Пример использования:
Цель:
Определение зависимости "один ко многим" между объектами.
Для чего используется:
Определение зависимости "один ко многим" между объектами таким образом, что при изменении состояния одного объекта все зависящие от него объекты были уведомлены об этом и обновились.
Пример использования:
Цель:
Управление поведением объекта в зависимости от состояния.
Для чего используется:
Позволяет нам управлять поведением объекта в зависимости от внутреннего состояние объекта.
Пример использования:
Цель:
Взаимозаменяемость семейства классов.
Для чего используется:
Определение семейства классов, инкапсулирование каждого из них и организация их взаимозаменяемости.
Пример использования:
Практическое использование шаблона Стратегия
Цель:
Определение основы класса и создание возможности подклассам переопределять его части.
Для чего используется:
Определяет основу класса и позволяет подклассам переопределять некоторые его части не изменяя его структуру в целом.
Пример использования:
Цель:
Описание действий, которые выполняются с каждым объектом в некоторой структуре.
Для чего используется:
Описание операций, которые выполняются с каждым объектом из некоторой структуры. Позволяет определить новую операцию без изменения классов этих объектов.
Пример использования: