Шаблонный метод (шаблон проектирования)

Материал из Seo Wiki - Поисковая Оптимизация и Программирование
Перейти к навигацииПерейти к поиску
Файл:Template Method UML.svg
Шаблонный метод (Template method): UML диаграмма классов.

Шаблонный метод (Template method) — шаблон проектирования, определяющий основу алгоритма и позволяющий наследникам переопределять некоторые шаги алгоритма, не изменяя его структуру в целом.

Применимость

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

Участники

Abstract class (абстрактный класс) - определяет абстрактные операции, замещаемые в наследниках для реализации шагов алгоритма; реализует шаблонный метод, определяющий скелет алгоритма. Шаблонный метод вызывает замещаемые и другие, определенные в Abstract class, операции.

Concrete class (конкретный класс) - реализует замещаемые операции необходимым для данной реализации способом.

Пример кода

В примере шаблонный метод реализуется для игр, в которых игроки по очереди делают свой ход.

/**
 * An abstract class that is common to several games in
 * which players play against the others, but only one is
 * playing at a given time.
 */

abstract class Game {

    protected int playersCount;

    abstract void initializeGame();

    abstract void makePlay(int player);

    abstract boolean endOfGame();

    abstract void printWinner();

    /* A template method : */
    final void playOneGame(int playersCount) {
        this.playersCount = playersCount;
        initializeGame();
        int j = 0;
        while (!endOfGame()) {
            makePlay(j);
            j = (j + 1) % playersCount;
        }
        printWinner();
    }
}

//Now we can extend this class in order to implement actual games:

class Monopoly extends Game {

    /* Implementation of necessary concrete methods */

    void initializeGame() {
        // Initialize money
    }

    void makePlay(int player) {
        // Process one turn of player
    }

    boolean endOfGame() {
        // Return true of game is over according to Monopoly rules
    }

    void printWinner() {
        // Display who won
    }

    /* Specific declarations for the Monopoly game. */

    // ...

}

class Chess extends Game {

    /* Implementation of necessary concrete methods */

    void initializeGame() {
        // Put the pieces on the board
    }

    void makePlay(int player) {
        // Process a turn for the player
    }

    boolean endOfGame() {
        // Return true if in Checkmate or Stalemate has been reached
    }

    void printWinner() {
        // Display the winning player
    }

    /* Specific declarations for the chess game. */

    // ...

}

Литература

  • Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссидес Приемы объектно-ориентированного проектирования. Паттерны проектирования = Design Patterns: Elements of Reusable Object-Oriented Software. — СПб: «Питер», 2007. — С. 366. — ISBN 978-5-469-01136-1 (также ISBN 5-272-00355-1)

Ссылки


Поведенческие шаблоны проектирования

Interpreter/Интерпретатор | Template Method/Шаблонный метод | Command/Команда | Chain of Responsibility/Цепочка обязанностей | Iterator/Итератор, Cursor | Mediator/Посредник | Memento/Хранитель, Token | Observer/Наблюдатель, Listener | State/Состояние | Strategy/Стратегия | Visitor/Посетитель | Event listener | Single-serving visitor | Hierarchical visitor |

bg:Шаблонен метод (шаблон) de:Schablonenmethode en:Template method pattern es:Template Method (patrón de diseño) fr:Patron de méthode (patron de conception) it:Template method ja:Template Method パターン pl:Metoda szablonowa (wzorzec projektowy) pt:Template Method th:เทมเพลทเมธอดแพตเทิร์น uk:Шаблонний метод (шаблон проектування) zh:模板方法

Если вам нравится SbUP.com Сайт, вы можете поддержать его - BTC: bc1qppjcl3c2cyjazy6lepmrv3fh6ke9mxs7zpfky0 , TRC20 и ещё....