Паттерн Шаблонный Метода задает скелет алгоритма в методе, оставляя определение реализации некоторых шагов субклассам.
Субклассы могут переопределять некоторые части алгоритма без изменения его структуры.
Основной задаче паттерна является создание шаблона алгоритма, то есть метод определяющий алгоритм в виде последовательности шагов. Один или несколько шагов определяются в
виде абстрактных методов, реализуемых субклассами. Таким образом гарантируется неизменность структуры алгоритма при том, что часть реализации предоставляется субклассами.
Шаблонный Метод определяет основные шаги алгоритма, оставляя субкласса возможность определения реализации этих шагов.
Паттерн Шаблонный Метод играет важную роль в повторном использовании кода. Абстрактный класс Шаблонного Метода может определять конкретные методы, абстрактные методы и перехватчики.
Абстрактные методы реализуются субклассами. Перехватчики не делают ничего или определяют поведения по умолчанию в абстрактном классе, но могут переопределяться в субклассах.
Чтобы субкласс не мог изменить алгоритм в Шаблонном Методе, объявите его с ключевым словом sealed
Фабричный Метод является специализированной версией Шаблонного Метода.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
using System; namespace Паттерн_Шаблонный_Метод { abstract class CoffeinBeverage { public abstract void PrepareRecipe(); protected abstract void Brew();//заваривать protected abstract void AddCondiments();//добавить добавки // А эти операции должны быть реализованы в подклассах protected void BoilWater() { Console.WriteLine("Кипятим воду"); } protected void PourInCup() { Console.WriteLine("Наливаем в чашку"); } // Это «хуки». Подклассы могут переопределять их, но это не обязательно, // поскольку у хуков уже есть стандартная (но пустая) реализация. Хуки // предоставляют дополнительные точки расширения в некоторых критических // местах алгоритма. protected virtual void Hook1() { } protected virtual void Hook2() { } } // Конкретные классы должны реализовать все абстрактные операции базового // класса. Они также могут переопределить некоторые операции с реализацией // по умолчанию. class Coffe : CoffeinBeverage { //Чтобы субкласс не мог изменить алгоритм в Шаболнном методе, объявите его с ключевым словом sealed public override sealed void PrepareRecipe() { BoilWater(); Brew(); PourInCup(); AddCondiments(); Hook1(); } protected override void Brew() { Console.WriteLine("Завариваем кофе"); } protected override void AddCondiments() { Console.WriteLine("Добавляем сахар и молоко"); } protected override void Hook1() { Console.WriteLine("Украшаяем кофе сливками"); } } class Tea: CoffeinBeverage { //Чтобы субкласс не мог изменить алгоритм в Шаболнном методе, объявите его с ключевым словом sealed public override sealed void PrepareRecipe() { BoilWater(); Brew(); PourInCup(); AddCondiments(); } protected override void Brew() { Console.WriteLine("Добавляем чайный пакетик"); } protected override void AddCondiments() { Console.WriteLine("Добавляем лимон"); } } class Program { static void Main(string[] args) { CoffeinBeverage coffe = new Coffe(); CoffeinBeverage tea = new Tea(); coffe.PrepareRecipe(); //в результате инкапсуляции нам доступен только 1 метод PrepareRecipe() tea.PrepareRecipe(); Console.ReadKey(); } } } |
1 2 3 4 5 6 7 8 9 |
Кипятим воду Завариваем кофе Наливаем в чашку Добавляем сахар и молоко Украшаяем кофе сливками Кипятим воду Добавляем чайный пакетик Наливаем в чашку Добавляем лимон |