Шаблонный метод (Template method)

Предположим, что программная логика некоего алгоритма представлена в виде набора вызовов методов. При использовании шаблонного метода создаётся абстрактный класс, который реализует только часть методов программной логики, оставляя детали реализации остальных методов своим потомкам. Благодаря этому общая структура алгоритма остаётся неизменной, в то время как некоторые конкретные шаги могут изменяться.

В качестве иллюстрации применения шаблонного метода рассмотрим класс с методом сортировки. Пусть этот метод вызывает отдельный метод сравнения элементов сортируемого набора. Классы-наследники переопределяют метод сравнения, позволяя, например, реализовать сортировку по убыванию или по возрастанию.

using System;

public abstract class Sorter

{

private readonly int[] data;

protected Sorter(params int[] source)

{

data = new int[source.Length];

Array.Copy(source, data, source.Length);

}

protected abstract bool Compare(int x, int y);

public void Sort()

{

for (var i = 0; i < data.Length - 1; i++)

{

for (var j = i + 1; j < data.Length; j++)

{

if (Compare(data[j], data[i]))

{

var temp = data[i];

data[i] = data[j];

data[j] = temp;

}

}

}

}

public int[] GetData()

{

var result = new int[data.Length];

Array.Copy(data, result, data.Length);

return result;

}

}

public class GreaterFirstSorter: Sorter

{

public GreaterFirstSorter(params int[] source): base(source){ }

protected override bool Compare(int x, int y)

{

return x > y;

}

}

public class TemplateMethodExample

{

public static void Main()

{

var sorter = new GreaterFirstSorter(1, 3, -10, 0);

sorter.Sort();

var result = sorter.GetData();

}

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: