Паттерны — примеры из жизни

Честно сказать, изучая и сравнивая паттерны, в моей голове сложилось мнение, что мое или чье-либо другое трактование данных паттернов, может отличаться от оригинала, и наверное это нормально, потому что связано с возможной недосказанностью, плохими примерами или преподавательскими способностями авторов, а иногда видишь, как паттерн "притягивают за уши" к ситуации, но все же, в некоторых трактованиях многие авторы сходятся. В свою очередь, я постараюсь дать определение паттернам, основываясь на их названиях и своих знаниях.

Порождающие шаблоны проектирования (Creational)

Именование Описание
Фабрика Не паттерн, а общая концепция, часто под этим словом подразумевают Простую фабрику
Простая фабрика Класс, в котором есть всего одна функция, которая создает различные объекты в зависимости от переданных в нее аргументов
Абстрактная фабрика Интерфейс или абстрактный класс, с функциями, которые нужно реализовать, чтобы создавать объекты одной группы. Например нам нужна фабрика создания мебели, которая умеет создавать: шкаф, диван, кресло. Все бы ничего, но людям нужны разные стили мебели: классический, современный, футуристичный. Поэтому, логично создать 3 фабрики, каждая фабрика будет уметь делать ровно три предмета (шкаф, диван, кресло), но каждая в своем стиле (классический, современный, футуристичный).
Фабричный метод Реализованная функция интерфейса или абстрактного класса, вызов которой создает объект
Создающий метод Функция класса, которая создает объект класса, в котором находится
Статический фабричный метод Статичная функция класса, которая создает объект класса, в котором находится
Одиночка Функция класса, которая создает объект класса, в котором находится. Но, если вызвать данную функцию повторно, то она возвратит объект, который был создан при первом вызове функции.
Строитель

Пример из жизни: строительная бригада, которая умеет строить Дом с Садом, или Дом с бассейном, или Дом с гаражом и бассейном

Класс, последовательный вызов функций которого, создают объект только одного вида, но часто с разным содержимым: смотри пример из жизни. Хорошей реализацией считается, когда в классе-строителе есть функция финализации (finalize), вызов которой, помечает данный объект свойством законченности, т.е. объект становится более неизменяемым.

Прототип

Пример из жизни: процесс деления клеток

Пример в программировании: функция, которая умеет создавать копию объекта в котором она находится или копию переданного в нее объекта

 

Структурные шаблоны проектирования (Structural)

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

Декоратор

Также известен как: Обёртка, Decorator

Паттерны — примеры из жизни

Пример из жизни

Декоратор - человек, который принимает заказы только на оформление чего-либо, например: театр, магазин, картина.

В программном смысле

Класс, расширяющий функциональность другого класса c использованием наследования.


Фасад

Также известен как: Facade

Паттерны — примеры из жизни

Пример из жизни

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

В программном смысле

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

Важный момент

Часто целью данного паттерна является соблюдение закона Деметры.

Фабрика vs Фасад

Фасад не создает новые объекты.


Шлюз

Также известен как: Gateway

Паттерны — примеры из жизни

Пример из жизни

Любой компьютер при подключении к интернету, должен себя идентифицировать у интернет-провайдера, обычно, компьютер показывает Вам форму ввода логина/пароля (форма в этом случае является реализацией паттерна Фасад), которые после ввода отправляется на шлюз интернет-провайдера.

Фасад vs Шлюз

Фасад реализуется стороной которая обращается куда-либо, а Шлюз реализуется стороной к которой обращаются.


Компоновщик

Также известен как: Дерево, Composite

Паттерны — примеры из жизни

Пример из жизни

Компоновщик (от лат. componere «складывать») - человек, который может сложить предметы в коробку, и предоставить информацию о том, сколько в коробке предметов, какова их общая стоимость, и т.п. обобщенную информацию. Так же, компоновщики часто собирают что-то большое из чего-то маленького, например автомобиль из деталей, деталь автомобиля из более мелких деталей.

В программном смысле

Функция, которая создает основной объект и наполняет его второстепенными объектами, при этом основной и второстепенные объекты должны быть одного типа (имплементируя единый интерфейс).


Адаптер

Также известен как: Adapter / Wrapper

Паттерны — примеры из жизни

Пример из жизни

Переходник с одного типа розетки на другой тип розетки, и есть Адаптер.

В программном смысле

Объект реализующий интерфейсы двух других объектов, которым нужно взаимодействие друг с другом.


Мост

Также известен как: Bridge

Паттерны — примеры из жизни

Пример из жизни

Есть 2 города разделяемые рекой, для взаимодействия между ними строят мост, города развиваются каждый по-своему, но мост не меняется, городам приходится учитывать строение моста (города подстраиваются под мост, а не мост под города).

В программном смысле

Чаще всего, мост - это класс с интерфейсом, который должны реализовать оба объекта (которым нужно взаимодействие между собой)

Адаптер vs Мост

Паттерн Мост очень похож на Адаптер, но Адаптер адаптируется под обе стороны, а Мост говорит, чтобы обе стороны подстраивались под него


Приспособленец

Альтернативные названия: Flyweight

Паттерны — примеры из жизни

Пример из жизни

Человеку приходится адаптироваться к погодным условиям, например зимой одевать теплые вещи.

В программном смысле

Класс реализующий существующий интерфейс, для взаимодействия.

Важный момент

В современном мире, очень часто данный паттерн связывают с разделяемой памятью, но исторически было не так однозначно.

Адаптер vs Приспособленец

Приспособленец это конечная вещь, а Адаптер, это промежуточная вещь


Заместитель

Также известен как: Proxy

Паттерны — примеры из жизни

Пример из жизни

Заместитель руководителя имеет те же полномочия что и руководитель (в момент отсутствия руководителя).

В программном смысле

Объект, который перехватывает вызовы к оригинальному объекту.

 

Поведенческие шаблоны проектирования (Behavioral)

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

Цепочка обязанностей

Также известен как: CoR, Chain of Command, Chain of Responsibility

Паттерны — примеры из жизни

Пример из жизни

Вы купили новый компьютер, но он не включается - Вы звоните в компанию-производитель, и начинается цепочка получения ответа:

  1. с Вами говорит робот, и если он не смог дать ответ, то переключает Ваш звонок далее
  2. с Вами говорит оператора поддержки клиентов, и если он не смог дать ответ, то переключает Ваш звонок далее
  3. с Вами говорит инженер и т.д.

В программном смысле

Цепочка образуется из звеньев цепи - объектов, и имеет следующие особенности:

  1. каждое из звеньев цепи имеет ссылку на следующее звено в цепи (одно звено знает только про одно звено, кроме последнего звена, которое не знает ничего о другом звене), таким образом, при получении запроса звено может что-то сделать с запросом, и обязано передать запрос следующему звену в цепочке.
  2. если звену не интересен запрос, звено не обрабатывает запрос и просто передает его следующему звену
  3. длина цепочки не имеет никакого значения
  4. передавая запрос в первое звено, Вы можете быть уверены, что все звенья в цепи смогут его обработать
  5. есть и подход, когда звено не обязательно должно передавать запрос дальше

Команда

Также известен как: Command

Паттерны — примеры из жизни

Пример из жизни

Генерал отдает Полковнику команду "наступление на противника", каждый из Полковников отдает свою команду, например "наступление по левому флангу". Следовательно, Генералу важно, чтобы каждый Полковник правильно понял команду, Полковнику важно, чтобы каждый Рядовой правильно понял команду. Чтобы все правильно понимали команду, нужно всех обучить всем известным командам.

Важно: паттерн подразумевает простую возможность достижения чего-то более сложного

В программном смысле

Объект X реализованный по интерфейсу Command, о котором знает объект A, чтобы объект A мог обращаться к объекту X по заранее согласованным функциям интерфейса.

Фасад vs Команда

Паттерн "Фасад" не обязывает реализовывать какой-либо интерфейс, а паттерн "Команда" - обязывает (Генерал знает команду, благодаря которой Полковник сделает все правильно).


Итератор

Также известен как: Iterator

Паттерны — примеры из жизни

Пример из жизни

Путешественник, который рисует на карте точки и стрелки, которыми любой желающий может воспользоваться, чтобы пройти незабываемое путешествие. 

В программном смысле

Идея паттерна Итератор состоит в том, чтобы вынести поведение обхода коллекции из самой коллекции в отдельный класс. Отсюда, имеет 2 вида итераторов:

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

Стратегия

Также известен как: Strategy

Паттерны — примеры из жизни

Пример из жизни

Вам нужно добраться до аэропорта. Можно доехать на автобусе, такси или велосипеде. Здесь вид транспорта является стратегией. Вы выбираете конкретную стратегию в зависимости от контекста — наличия денег или времени до отлёта.

В программном смысле

Класс Context имеет функцию поиска, которая пробегается по известным ей классам (эти классы обязаны имплементировать интерфейс Strategy требующей создать функцию, которую будет вызывать класс Context).


Посредник

Также известен как: Intermediary, Controller, Mediator

Паттерны — примеры из жизни

Пример из жизни

Пилоты самолётов не общаются напрямую с другими пилотами. Вместо этого они связываются с диспетчером, который координирует действия самолётов.

В программном смысле

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

Посредник vs Фасада

Фасад оговаривает вопрос структуры (кто кому подчиняется) а Посредник реализует эту структуру.


Хранитель

Также известен как: Memento, Снимок

На мой взгляд, это один из самых запутанных паттернов, потому что всюду его пытаются описать слишком заумно.

Паттерны — примеры из жизни

Терминология

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

  1. «Originator/Создатель» - объект/значение
  2. «Caretaker/Опекун» - объект, в который помещается Originator
  3. «Memento/Хранитель» - объект обертка Originator-а (рудемент, которого не должно быть в той интерпретации паттерна, которую я наблюдаю в настоящий момент в многих интернет-источниках)

Простой пример

OriginatorObject = new Originator('{"value":"1"}') // создаем объект из переданного json

Caretake.set(OriginatorObject) // функция set преобразует OriginatorObject в json и сохранит его в себе 

OriginatorObject.value = '{"value":"2"}' // изменяем состояние объекта OriginatorObject 

OriginatorObject = Caretake.get() // восстановление OriginatorObject с помощью внутреннего вызова new Originator('{"value":"1"}')

Внимание, в примере нет объекта «Memento/Хранитель», потому что «Memento/Хранитель» это внутренний класс, который используется объектом Caretake, чтобы сохранить состояние объекта/значения Originator. Практически, вместо «Memento/Хранитель» может быть простая сериализация значения в json / из json.


Наблюдатель

Также известен как: Издатель-Подписчик, Слушатель, Observer

Для реализации паттерна Вам понадобится:

  • Event (Событие) - событие, которое может возникнуть (например пришло письмо)
  • Subject (Издатель) - объект, который уведомляет о событии
  • Observer (Подписчик/Слушатель) - объект, который подписывается на событие и ожидает уведомление

Подписчик vs Слушатель

  • Подписчик (Subscriber) - объект, который подписался сразу на несколько событий одного объекта (например человек подписался на два журнала одного издательства)
  • Слушатель (Listener) - объект, который подписался только на одно событий одного объекта (например человек подписался на один журнала одного издательства)

Виды уведомлений

  • push - когда Observer-у предоставляется вся информация о уведомлении (почтальон вручил ценную посылку прямо в руки человека)
  • pull - когда Observer подтягивает информация о уведомлении (человек получил уведомление о том, что ему пришла посылка, теперь он должен сходить на почту за посылкой)

Пример из жизни

Почтовое отделение и человек.

Нюанс

Иногда, Event (Событие) и Subject (Издатель) объединяют, пример из жизни: знаменитость может уведомить лично своих фанатов.

Celebrity-Fan Example

В программном смысле

Observer {
    abstract public update ( SplSubject subject ) : void // этот метод будет вызван, когда в объекте Subject произойдет изменение состояния
}
Subject {
    abstract public attach ( SplObserver observer ) : void
    abstract public detach ( SplObserver observer ) : void
    abstract public notify ( void ) : void // объект Subject при изменении своего состояния, должен вызывать метод update(this) каждого Observer-а
}

Источник: 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8

Оцени публикацию:
  • 0,0
Оценили: 0


Предложения и пожелания:

 

youtube.com/watch?v=7hFivbgIEqk

При полном или частичном использовании материалов данного сайта, ссылка на сайт "yapro.ru" обязательна как на источник информации.
Автоматический импорт материалов и информации с сайта запрещен.
Copyrights © 2007 - 2019 YaPro.Ru

Лебеденко Николай Николаевич
Ошибка в тексте? Выделите её мышкой и нажмите: Ctrl + Enter