C#: Шаблонний метод

Template Method Шаблонний метод Template Method

Шаблонний метод — це поведінковий патерн, який визначає кістяк алгоритму в суперкласі та змушує підкласи реалізувати конкретні кроки цього алгоритму.

Детальніше про Шаблонний метод

Особливості паттерна на C#

Складність:

Популярність:

Застосування: Шаблонні методи можна зустріти в багатьох бібліотечних класах C#. Розробники створюють їх, щоб дозволити клієнтам легко та швидко розширювати стандартний код за допомогою спадкування.

Ознаки застосування патерну: Клас змушує своїх нащадків реалізувати методи-кроки, але самостійно реалізовує структуру алгоритму.

Приклад: Структура патерну

Цей приклад показує структуру патерну Шаблонний метод, а саме — з яких класів він складається, які ролі ці класи виконують і як вони взаємодіють один з одним.

Program.cs: Приклад структури патерну

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace RefactoringGuru.DesignPatterns.TemplateMethod.Structural
{
    abstract class AbstractClass
    {
        public void templateMethod()
        {
            this.baseOperation1();
            this.requiredOperations1();
            this.baseOperation2();
            this.hook1();
            this.requiredOperation2();
            this.baseOperation3();
            this.hook2();
        }

        protected void baseOperation1()
        {
            Console.Write("AbstractClass says: I am doing the bulk of the work\n");
        }

        protected void baseOperation2()
        {
            Console.Write("AbstractClass says: But I let subclasses override some operations\n");
        }

        protected void baseOperation3()
        {
            Console.Write("AbstractClass says: But I am doing the bulk of the work anyway\n");
        }

        protected abstract void requiredOperations1();

        protected abstract void requiredOperation2();

        protected virtual void hook1() { }

        protected virtual void hook2() { }
    }

    class ConcreteClass1 : AbstractClass
    {
        protected override void requiredOperations1()
        {
            Console.Write("ConcreteClass1 says: Implemented Operation1\n");
        }

        protected override void requiredOperation2()
        {
            Console.Write("ConcreteClass1 says: Implemented Operation2\n");
        }
    }

    class ConcreteClass2 : AbstractClass
    {
        protected override void requiredOperations1()
        {
            Console.Write("ConcreteClass2 says: Implemented Operation1\n");
        }

        protected override void requiredOperation2()
        {
            Console.Write("ConcreteClass2 says: Implemented Operation2\n");
        }

        protected override void hook1()
        {
            Console.Write("ConcreteClass2 says: Overridden Hook1\n");
        }
    }

    class Client
    {
        public static void ClientCode(AbstractClass ac)
        {
            ac.templateMethod();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("Same client code can work with different subclasses:\n");

            Client.ClientCode(new ConcreteClass1());

            Console.Write("\n");
            Console.Write("Same client code can work with different subclasses:\n");
            Client.ClientCode(new ConcreteClass2());
        }
    }
}

Output.txt: Результат виконання

Same client code can work with different subclasses:
AbstractClass says: I am doing the bulk of the work
ConcreteClass1 says: Implemented Operation1
AbstractClass says: But I let subclasses override some operations
ConcreteClass1 says: Implemented Operation2
AbstractClass says: But I am doing the bulk of the work anyway

Same client code can work with different subclasses:
AbstractClass says: I am doing the bulk of the work
ConcreteClass2 says: Implemented Operation1
AbstractClass says: But I let subclasses override some operations
ConcreteClass2 says: Overridden Hook1
ConcreteClass2 says: Implemented Operation2
AbstractClass says: But I am doing the bulk of the work anyway