Паттерны проектирования: Шаблонный метод (Template method)

Шаблонный метод (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();

Результат будет следующим.

Исходный код учебного проекта: http://1drv.ms/11XT3Ec

Добавить комментарий