Инструменты пользователя

Инструменты сайта


pattern_template_method

Назад

Паттерн Шаблонный Метод один из фундаментальных приемов повторного использования кода. Задает «скелет» алгоритма в методе, оставляя определение реализации некоторых шагов субклассам. Субклассы могут переопределять некоторые части алгоритма без изменения его структуры.

Основной задачей паттерна является создание шаблон алгоритма (в шаблоном методе реализована последовательность вызова действий).

CaffeineBeverage
abstract public class CaffeineBeverage
{
    public void boilWater()
    {
        System.out.println("Вскипятить воду.");
    }
 
    abstract public void brew();
 
    public void pourInCup()
    {
        System.out.println("Перелить в чашку.");
    }
 
    abstract public void addCondiments();
 
    /*Шаблонный Метод*/
    final public void prepareRecipe()
    {
        boilWater();
        brew();
        pourInCup();
        addCondiments();
    }
 
}
 
class Tea extends CaffeineBeverage
{
    public void brew()
    {
        System.out.println("Заварить чай.");
    }
 
    public void addCondiments()
    {
        System.out.println("Добавить лимон.");
    }  
}
 
class Coffe extends CaffeineBeverage
{
    public void brew()
    {
        System.out.println("Заварить кофе.");
    }
 
    public void addCondiments()
    {
        System.out.println("Добавить молоко.");
    }
 
}
Main
public class Main
{
    public static void main(String[] args)
    {
        CaffeineBeverage tea = new Tea();
        tea.prepareRecipe();
    }
}

Перехватчик

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

CaffeineBeverage
abstract public class CaffeineBeverage
{
    protected boolean flag;
    public void boilWater()
    {
        System.out.println("Вскипятить воду.");
    }
 
    abstract public void brew();
 
    public void pourInCup()
    {
        System.out.println("Перелить в чашку.");
    }
 
    abstract public void addCondiments();
 
    final public void prepareRecipe()
    {
        boilWater();
        brew();
        pourInCup();
        if(flag)
        {
            addCondiments();
        }
 
    }
 
}
 
class Tea extends CaffeineBeverage
{
    public Tea(boolean flag)
    {
        this.flag = flag;
    }
    public void brew()
    {
        System.out.println("Заварить чай.");
    }
 
    public void addCondiments()
    {
        System.out.println("Добавить лимон.");
    }  
}
 
class Coffe extends CaffeineBeverage
{
    public Coffe(boolean flag)
    {
        this.flag = flag;
    }   
 
    public void brew()
    {
        System.out.println("Заварить кофе.");
    }
 
    public void addCondiments()
    {
        System.out.println("Добавить молоко.");
    }
 
}
Main
public class Main
{
    public static void main(String[] args)
    {
        CaffeineBeverage tea = new Tea(false);
        tea.prepareRecipe();
    }
}