Template Method (Шаблонный метод)
Шаблонный метод (Template Method) — это паттерн проектирования, который определяет общий алгоритм в базовом классе, оставляя некоторые шаги для реализации в подклассах. Этот паттерн позволяет переопределять определенные шаги алгоритма без изменения его структуры. Он полезен, когда у вас есть несколько классов, которые реализуют один и тот же алгоритм, но с некоторыми различиями.
Пример использования паттерна Template Method на Java
Рассмотрим пример, в котором мы создадим систему для приготовления напитков. У нас будет базовый класс Beverage
, который определяет общий алгоритм приготовления, и подклассы для конкретных напитков, таких как Tea
и Coffee
.
Шаг 1: Создание абстрактного класса
public abstract class Beverage {
// Шаблонный метод
public final void prepareRecipe() {
boilWater();
brew();
pourInCup();
addCondiments();
}
// Шаги алгоритма
private void boilWater() {
System.out.println("Boiling water");
}
protected abstract void brew(); // Шаг, который будет реализован в подклассах
private void pourInCup() {
System.out.println("Pouring into cup");
}
protected abstract void addCondiments(); // Шаг, который будет реализован в подклассах
}
Шаг 2: Реализация конкретных напитков
public class Tea extends Beverage {
@Override
protected void brew() {
System.out.println("Steeping the tea");
}
@Override
protected void addCondiments() {
System.out.println("Adding lemon");
}
}
public class Coffee extends Beverage {
@Override
protected void brew() {
System.out.println("Dripping coffee through filter");
}
@Override
protected void addCondiments() {
System.out.println("Adding sugar and milk");
}
}
Шаг 3: Использование шаблонного метода
Теперь мы можем использовать наш шаблонный метод в коде:
public class TemplateMethodPatternDemo {
public static void main(String[] args) {
Beverage tea = new Tea();
tea.prepareRecipe();
System.out.println();
Beverage coffee = new Coffee();
coffee.prepareRecipe();
}
}
Объяснение
-
Абстрактный класс
Beverage
: Определяет шаблонный методprepareRecipe()
, который содержит общий алгоритм приготовления напитка. Он включает в себя шаги, которые не изменяются (например, кипячение воды и наливание в чашку), а также абстрактные методыbrew()
иaddCondiments()
, которые должны быть реализованы в подклассах. -
Классы
Tea
иCoffee
: Реализуют абстрактные методыbrew()
иaddCondiments()
, предоставляя конкретные шаги для приготовления чая и кофе. -
Класс
TemplateMethodPatternDemo
: Демонстрирует использование шаблонного метода. Мы создаем экземплярыTea
иCoffee
и вызываем методprepareRecipe()
, который выполняет весь алгоритм приготовления.
Заключение
Паттерн "Шаблонный метод" позволяет определить общий алгоритм в базовом классе, оставляя возможность для изменения некоторых шагов в подклассах. Это упрощает код и делает его более гибким и расширяемым. В приведенном примере мы увидели, как можно использовать шаблонный метод для приготовления различных напитков, сохраняя при этом общую структуру алгоритма.