Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Design Patterns via C#.pdf
Скачиваний:
154
Добавлен:
17.03.2016
Размер:
13.25 Mб
Скачать

270

Паттерн Template Method

Название

Шаблонный метод

Также известен как

-

Классификация

По цели: поведенческий По применимости: к классам

Частота использования

Средняя

- 1 2 3 4 5

Назначение

Паттерн Template Method - формирует структуру алгоритма и позволяет в производных классах реализовать, заместить (перекрыть) или переопределить определенные шаги (участки) алгоритма, не изменяя структуру алгоритма в целом.

Введение

Одним из важнейших технологических приемов структурного программирования является декомпозиция (разбиение) решаемой задачи на подзадачи. Подзадача – это более простая с точки зрения программирования часть исходной задачи. Алгоритмы решения таких подзадач называются вспомогательными алгоритмами. В связи с этим возможны два пути в построении алгоритма: «сверху-вниз» и «снизу-вверх». Программирование методом «сверху-вниз» (или метод последовательной детализации) – процесс пошагового разбиения алгоритма на более мелкие части с целью получения таких элементов, для которых независимым образом можно легко написать вспомогательные алгоритмы (шаги общего алгоритма).

Для лучшего понимания идеи использования техники «шаблонный метод» предлагается рассмотреть простейшую программу, которая рисует двухцветные государственные флаги.

Общий алгоритм рисования двухцветного флага разбивается на отдельные элементарные алгоритмы (шаги) по рисованию отдельной части флага. Пример приведенный ниже демонстрирует технику разбиения общего алгоритма по построению флага на два «подалгоритма», каждый из которых строит только часть флага.

271

 

 

abstract class TwoColorFlag

class Program

 

{

{

 

public void Draw()

static void Main()

{

{

 

DrawTopPart();

var flag

= new UkraineFlag();

DrawBottomPart();

flag.Draw();

}

}

 

 

}

 

protected abstract void DrawTopPart();

 

 

protected abstract void DrawBottomPart();

 

 

}

class PolandFlag : TwoColorFlag

 

 

 

class UkraineFlag :TwoColorFlag

 

 

{

 

 

 

{

 

 

protected override void DrawTopPart()

 

protected override void DrawTopPart()

{

 

 

 

{

 

 

Console.BackgroundColor

= ConsoleColor.White;

Console.BackgroundColor

= ConsoleColor.Blue;

Console.WriteLine(new string('

',

7));

Console.WriteLine(new string('

', 7));

}

 

 

 

}

 

 

protected override void DrawBottomPart()

protected override void DrawBottomPart()

{

 

 

 

{

 

 

Console.BackgroundColor

= ConsoleColor.Red;

Console.BackgroundColor

= ConsoleColor.Yellow;

Console.WriteLine(new string('

',

7));

Console.WriteLine(new string('

', 7));

}

 

 

 

}

 

 

}

 

 

 

}

 

 

См. Пример к главе: \022_Template Method\002_TemplateMethod

Как видно из примера кода, метод Draw из абстрактного класса TwoColorFlag содержит в себе шаблон (набор шагов как последовательность вызовов абстрактных методов DrawTopPart и DrawBottomPart) для рисования полос двухцветного флага, и программист который решит реализовать,

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

272

Структура паттерна на языке UML

См. Пример к главе: \022_Template Method\001_TemplateMethod

Структура паттерна на языке C#

 

 

abstract class AbstractClass

class Program

{

public abstract void PrimitiveOperation1();

{

 

 

public abstract void PrimitiveOperation2();

static

void Main()

 

{

 

public void TemplateMethod()

AbstractClass instance = new ConcreteClass();

{

instance.TemplateMethod();

PrimitiveOperation1();

}

 

 

PrimitiveOperation2();

}

 

 

}

 

 

 

 

}

class ConcreteClass : AbstractClass { public override void PrimitiveOperation1() { Console.WriteLine("PrimitiveOperation1"); }

public override void PrimitiveOperation2() { Console.WriteLine("PrimitiveOperation2"); } }

См. Пример к главе: \022_Template Method\001_TemplateMethod

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]