
Шаблонный метод (Template method) — это поведенческий шаблон проектирования, который определяет алгоритм, некоторые методы которого делегируются подклассам, позволяя тем самым переопределить некоторые шаги алгоритма не меняя его структуры.
Простейшая схема работы паттерна:
Как уже было сказано выше, данный шаблон проектирования позволяет заменять некоторые методы алгоритма, не меняя его структуры. В каких случаях это может быть полезно?
Допустим, мы пишем программу для современного ротоба, которая позволит нам готовить различные блюда. Пусть это будут каша и макароны.
Для готовки обоих блюд необходимо налить воды, либо молока, положить туда крупу для каши или макароны, возможно добавить какие-то приправы. Сделаем так, чтобы макароны варились на воде, а каша на молоке. В макароны добавим соль и перец, а в кашу соль.
Реализуем класс, представляющий шаблонный метод.
internal abstract class Food
{
public void Cooking()
{
GetLiquid();
GetIngredient();
GetSeasonings();
Process();
}
public abstract void GetLiquid();
public abstract void GetIngredient();
public virtual void GetSeasonings()
{
Console.WriteLine("Добавить соли");
}
public void Process()
{
Console.WriteLine("Мешаем до полного приготовления");
}
}
Метод Cooking будет отвечать за процесс готовки. Абстрактные методы GetLiquid и GetIngredient будут отвечать за добавление нужной жидкости и основного ингредиента. Виртуальным метод GetSeasonings будет отвечать за добавление приправ. Теперь создадим класс для приготовления макарон. В нем переопределим метод GetSeasonings, для того, чтобы дополнительно добавить перца.
class Pasta : Food
{
public override void GetLiquid()
{
Console.WriteLine("Добавим воды");
}
public override void GetIngredient()
{
Console.WriteLine("Насыпем макарон");
}
public override void GetSeasonings()
{
base.GetSeasonings();
Console.WriteLine("Добавим перца");
}
}
И класс для приготовления каши.
class Porridge : Food
{
public override void GetLiquid()
{
Console.WriteLine("Добавим молока");
}
public override void GetIngredient()
{
Console.WriteLine("Насыпем крупы");
}
}
Протестируем работу программы.
Console.WriteLine("Приготовим макароны");
var pasta = new Pasta();
pasta.Cooking();
Console.WriteLine("\nПриготовим кашу");
var porridge = new Porridge();
porridge.Cooking();
Результат будет следующим.