Обзор шаблона проектирования метода шаблона

В детстве я любила бумажных кукол. Фигурки вырезаны из бумаги, с отдельной одеждой, тоже из бумаги, которую обычно держат на куклах с помощью бумажных язычков. Причина, по которой я так их любила, заключалась в том, что я могла легко создавать новые образы для своих кукол и примерять их. Мои куклы меняли внешний вид по несколько раз в день. Я придумал идею нового образа, нарисовал ее, вырезал и вуаля, наряд готов. Хотя я не жалею о том, что являюсь разработчиком программного обеспечения, я понятия не имею, почему я так и не стал модельером.

Итак, поговорим о создании наряда из бумажной куклы на языке Java.

Создание экипировки на языке Java

Подумайте о бумажной кукле. Назовем ее Таней. Таня живет в стране с четырьмя полными сезонами, скажем, в Дании. А еще она увлечена модной одеждой (я бы сказала, Таня модница, но, если верить Городскому словарю, этот термин иногда имеет негативный оттенок, а настоящая модница не верит в тренды).

Предположим, вы хотите создать для нее летний наряд. Я думаю о белой блузке с джинсовыми шортами и нейтральными балетками на шнуровке. Теперь, когда у вас в уме есть четкий мысленный образ, вы можете рисовать и вырезать его. Следующий сезон - осень. Идея осеннего наряда - свитер, рваные джинсы и высокие кроссовки. Нарисуй, разрежь…

Вы заметили некоторые общие шаги в процессе создания одежды? Конечно, есть. Некоторые из этих шагов выполняются по-разному, в зависимости от сезона, который вы создаете. У каждого наряда свой верх, низ и обувь. При этом оба наряда должны быть нарисованы и скроены одинаково. Вы можете смоделировать эту ситуацию с помощью класса Outfit с методом, который знает общий набор шагов процесса. Детали для различных нарядов реализованы в унаследованных классах. Давайте посмотрим на диаграмму данных для создания наряда:

О, я вижу здесь возможность обновить ключевые концепции объектно-ориентированного программирования Java. Мне очень нравится идея освежить знания. Хм. Я чувствую, что собираюсь открыть колонку «Что мы о чем-то знаем?». Хорошо, теперь это официально. Тема дня - абстракция.

Что мы знаем об абстракции?

Согласно Оксфорду, абстракция - это качество работы с идеями, а не с событиями. Другими словами, это что-то существует, но у вас есть лишь смутное представление о нем.

Подумайте об онлайн-покупках. Все, что вам нужно знать, чтобы что-то купить на сайте, - это выбрать товар и разместить заказ. По истечении определенного периода ожидания заказанные вами вкусности найдут вас (или нет). Довольно просто. Я имею в виду, что вам не нужно действительно знать, как этот процесс работает с другой стороны веб-сайта. Где хранятся товары; кто готовит для вас заказ; как доставляются товары и т. д. Это волшебство называется абстракцией.

В Java используется та же концепция, что и в других объектно-ориентированных языках.

Абстракция в Java в нескольких словах

Основная цель абстракции в Java - справиться со сложностью, скрывая от пользователя ненужные детали. Это позволяет реализовать сложную логику поверх предоставленной абстракции, не понимая и даже не задумываясь обо всей скрытой сложности. Вам просто нужно знать, какие методы объекта доступны для вызова и какие входные параметры необходимы для запуска определенной операции.

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

Все идет нормально.

Если вы знакомы с шаблонами проектирования, вы узнаете элементы шаблона метода шаблонов на диаграмме экипировки. Но если вы новичок, вы можете начать с краткого обзора предыдущей главы Design Patterns Saga. Хорошо, давайте прямо, эта статья посвящена шаблонному методу.

Шаблон метода шаблон

Шаблонный метод - это шаблон поведенческого проектирования, который определяет скелет алгоритма в базовом классе и откладывает выполнение некоторых шагов подклассам без изменения общей структуры алгоритма. Этот шаблон используется, когда вы заметили, что у вас есть несколько классов с очень похожими функциями по порядку операций. Вы помните шаги; описать наряд, нарисовать, вырезать… И снова. Это наш вариант использования!

Эй, который час? Пришло время кода! Нет! Шутя. Недавно я впервые посмотрел фильм Бората. Мой мир больше не тот. Хорошо, вернемся к реальности, я просто хочу показать вам некоторый Java-код о том, как вы можете реализовать шаблонный метод.

Реализация шаблона метода шаблона

Давайте посмотрим на базовый класс Outfit.

Абстрактный класс Outfit объявляет методы, которые действуют как этапы алгоритма создания повседневного образа. Он также определяет фактический метод шаблона createDailyLook(). Этот метод вызывает методы описания в определенном порядке. Некоторые шаги объявлены абстрактными, другие имеют реализацию по умолчанию.

Классы Concrete Outfit могут переопределять все шаги базового класса, за исключением самого метода шаблона (иначе в чем смысл шаблона?). Подумайте о том, чтобы сделать шаблонный метод окончательным, чтобы подклассы не переопределяли его. Это обеспечивает последовательность этапов создания повседневной одежды и сокращает количество избыточного кода. Так могут выглядеть подклассы сезонной одежды.

Мне нечего добавить, все ясно.

Теперь, чтобы проверить шаблонный метод в действии, создайте Outfit Service. Давайте сойдемся с ума по шаблону и воспользуемся шаблоном Factory для создания конкретного класса. Просто потому, что мы можем! 😎

При вызове метода createOutfit() на лето будут распечатаны следующие журналы:

SummerOutfit - white blouse
SummerOutfit - denim shorts
SummerOutfit - neutral lace-up flats
Outfit - drawing outfit according to selections
Outfit - cutting drawn outfit

А это на осень:

AutumnOutfit - white sweater
AutumnOutfit - ripped jeans
AutumnOutfit - veja sneakers
Outfit - drawing outfit according to selections
Outfit - cutting drawn outfit

Это все! Чисто и просто!

Осенний наряд Тани готов. Но финальный вид вас не полностью устраивает. Вы понимаете, что в этом наряде чего-то не хватает. Что-нибудь теплое. Знаете, в Дании осень. К белому свитеру и рваным джинсам действительно подошло верблюжье пальто.

Подумайте о нескольких вещах: как добавить к образу верхнюю одежду? Как сделать это динамически, не меняя определения базового класса? Звучит как вызов? Да, это так.

Следующая глава в Саге о паттернах дизайна: паттерн-декоратор. Просто красивое лицо? Или виртуальный выкидной нож😉? Фарвил!

Вот ссылка на проект git этого поста.

Главы саги о паттернах дизайна:

  1. Начало: Обзор Factory Design Pattern
  2. Бумажная кукла: Обзор шаблона разработки метода шаблонов
  3. Капуста: Обзор шаблона проектирования Decorator
  4. Manta Ray vs Butterfly: Обзор паттерна разработки стратегии