0 4.8K

Паттерн «Шаблонный метод» (Template Method)

Категории: Программирование

Назначение: шаблонный метод определяет основу алгоритма и позволяет подклассам переопределять некоторые шаги алгоритма, не изменяя его структуры в целом.
Другими словами: шаблонный метод — это каркас, в который наследники могут подставить реализации недостающих элементов.

Когда использовать шаблонный метод?

  • Когда планируется, что в будущем подклассы должны будут переопределять различные этапы алгоритма без изменения его структуры

  • Когда в классах, реализующим схожий алгоритм, происходит дублирование кода. Вынесение общего кода в шаблонный метод уменьшит его дублирование в подклассах.

Схематично в UML можно изобразитьTemplate Method следующим образом:

template method uml

Реализация шаблона на .NET

 /// <summary>
    /// The 'AbstractClass' abstract class
    /// </summary>
    public abstract class AbstractClass
    {
        public abstract void PrimitiveOperation1();
        public abstract void PrimitiveOperation2();

        // The "Template method"
        public void TemplateMethod()
        {
            PrimitiveOperation1();
            PrimitiveOperation2();
            Console.WriteLine("");
        }
    }

    /// <summary>
    /// A 'ConcreteClass' class
    /// </summary>
    public class ConcreteClassA : AbstractClass
    {
        public override void PrimitiveOperation1()
        {
            Console.WriteLine("ConcreteClassA.PrimitiveOperation1()");
        }
        public override void PrimitiveOperation2()
        {
            Console.WriteLine("ConcreteClassA.PrimitiveOperation2()");
        }
    }

    /// <summary>
    /// A 'ConcreteClass' class
    /// </summary>
    public class ConcreteClassB : AbstractClass
    {
        public override void PrimitiveOperation1()
        {
            Console.WriteLine("ConcreteClassB.PrimitiveOperation1()");
        }
        public override void PrimitiveOperation2()
        {
            Console.WriteLine("ConcreteClassB.PrimitiveOperation2()");
        }
    }

Участники

  • AbstractClass: определяет шаблонный метод TemplateMethod(), который реализует алгоритм. Алгоритм может состоять из последовательности вызовов других методов, часть из которых может быть абстрактными и должны быть переопределены в классах-наследниках. При этом сам метод TemplateMethod(), представляющий структуру алгоритма, переопределяться не должен. Поэтому в данном случае мы можем объявить его с модификатором sealed для закрытия от переопределения в подклассах.

  • ConcreteClass: подкласс, который может переопределять различные методы родительского класса.

Схема примера использования паттерна в реальной жизни:

шаблонный метод принцип работы паттерна

Резюме:

Паттерн Template Method необходимо использовать, когда необходимо определить порядок действий (скелет) алгоритма, но позволить классам потомкам самим реализовывать нужным способом эти шаги.

Примеры реализации паттерна в .net framework

Примеров использования паттерна «Шаблонный метод» в .NET Framework очень много. По большому счету, любой абстрактный класс, который содержит защищенный абстрактный метод, является примером паттерна «Шаблонный метод». Например WCF просто пропитан этим паттерном. Одним из примеров является класс CommunicationObject, методы которого Open, Close, Abort и др. «запечатаны» (sealed), но при этом вызывают виртуальные или абстрактные методы OnClosed, OnAbort и т. д. Другими примерами этого паттерна в составе WCF могут служить ChannelBase, ChannelFactoryBase, MessageHeader, ServiceHostBase, BodyWriter, которые определяют каркас алгоритма и позволяют наследникам задавать лишь некоторые шаги.

 

Комментарии:

Пожалуйста авторизируйтесь, чтобы получить возможность оставлять комментарии