→ Пошук по сайту       Увійти / Зареєструватися
Знання Патерни Патерни поведінки — Behavioral patterns

22. Шаблонний метод — Template method

22.	Шаблонний метод — Template method

Уявімо собі, що ми маємо розробити систему пошуку повідомлень для поштової стриньки. Процес пошуку складається із декількох операцій, які є загальними для всіх повідомлень, але специфіка методів може відрязнятися для деяких типів повідомлень.

Вам слід написати клас Searcher, який буде інкапсулювати алгоритм пошуку, але ви також хочете залишити можливість перевизначити деякі елементи алгоритму для певних методів. Як це можна легко зробити?

Шаблонний Метод задає покроково алгоритм, а елементи алгоритму можуть бути довизначені в похідних класах.

Патерн сам по собі є досить інтуїтивним, так само як і його реалізація. Вам потрібен базовий клас, що містить основні операції і один Шаблонний Метод (Search), який буде оперувати базовими операціями. Кожна із операцій може бути перевантажена в похідному класі.

UML-діаграма 13. Шаблоний Метод

Я написав тривіальну імплементацію патерну, оскільки викликаю операції одну за одною в шаблонному методі. В реальному житті, швидше за все, буде складний алгоритм, побудований на основі базових операції. І вам буде потрібно тільки перевантажити деякі із них, або, інакше кажучи, перевантажити частини алгоритму. Також можна позначити базові операції за допомогою abstract, що буде вимагати їхньої імплементації у похідних класах. 

Уривок коду 22.1. Клас MessagesSearcher із шаблонним методом

 class MessagesSearcher
{
    protected DateTime DateSent;
    protected String PersonName;
    protected int ImportanceLevel;

    public MessagesSearcher(DateTime dateSent, String personName, int importanceLevel)
    {
        DateSent = dateSent;
        PersonName = personName;
        ImportanceLevel = importanceLevel;
    }

    // Базові операції (primitive operations)
    protected void CreateDateCriteria()
    {
        Console.WriteLine("Standard date criteria has been applied.");
    }
    protected void CreateSentPersonCriteria()
    {
        Console.WriteLine("Standard person criteria has been applied.");
    }
    protected void CreateImportanceCriteria()
    {
        Console.WriteLine("Standard importance criteria has been applied.");
    }

    // Метод, який називають шаблонним
    public String Search()
    {
        CreateDateCriteria();
        CreateSentPersonCriteria();
        Console.WriteLine("Template method does some verification accordingly to search algo.");
        CreateImportanceCriteria();
        Console.WriteLine("Template method verifies if message could be so important or useless from person provided in criteria.");
        Console.WriteLine();
        return "Some list of messages...";
    }
}

class ImportantMessagesSearcher : MessagesSearcher
{
    public ImportantMessagesSearcher(DateTime dateSent, String personName)
        : base(dateSent, personName, 3) // «3» означає, що повідомлення важливе
    {
    }

    // Одна операція перевантажена (IMPORTANT в кінці)
    protected void createImportanceCriteria()
    {
        Console.WriteLine(
           "Special importance criteria has been formed: IMPORTANT");
    }
}




class UselessMessagesSearcher : MessagesSearcher
{
    public UselessMessagesSearcher(DateTime dateSent, String personName)
        : base(dateSent, personName, 1) // «1» означає, що «в пень» воно треба
    {
    }
    // Одна операція перевантажена (вивід відрізняється словом «USELESS» в кінці)
    protected void createImportanceCriteria()
    {
        Console.WriteLine("Special importance criteria has been formed: USELESS");
    }
}

Уривок коду 22.2. Використання

 MessagesSearcher searcher = new UselessMessagesSearcher(DateTime.Today, "Sally");
searcher.Search();

searcher = new ImportantMessagesSearcher(DateTime.Today, "Killer");
searcher.Search();

Вивід для першого та другого пошуку:

 Standard date criteria has been applied.
Standard person criteria has been applied.
Template method does some verification accordingly to search algo.
Special importance criteria has been formed: USELESS
Template method verifies if message could be so important or useless from person provided in criteria.

Standard date criteria has been applied.
Standard person criteria has been applied.
Template method does some verification accordingly to search algo.
Special importance criteria has been formed: IMPORTANT
Template method verifies if message could be so important or useless from person provided in criteria.

По матеріалам книги Андрія Будая "Дизайн патерни – просто, як двері". Матеріал розміщується за домовленістю з автором.
Робота представлена за умовами ліцензії Creative Commons Attribution-NonCommercial 3.0 Unported License.

загрузка...
Сторінки, близькі за змістом