Skip to content

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();
    }
}

Объяснение

  1. Абстрактный класс Beverage: Определяет шаблонный метод prepareRecipe(), который содержит общий алгоритм приготовления напитка. Он включает в себя шаги, которые не изменяются (например, кипячение воды и наливание в чашку), а также абстрактные методы brew() и addCondiments(), которые должны быть реализованы в подклассах.

  2. Классы Tea и Coffee: Реализуют абстрактные методы brew() и addCondiments(), предоставляя конкретные шаги для приготовления чая и кофе.

  3. Класс TemplateMethodPatternDemo: Демонстрирует использование шаблонного метода. Мы создаем экземпляры Tea и Coffee и вызываем метод prepareRecipe(), который выполняет весь алгоритм приготовления.

Заключение

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