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

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

поведенческий

Описан в Design Patterns

Да

Шаблонный метод (Template method): UML диаграмма классов.

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

Содержание

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

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

Участники

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

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

Concrete class предполагает, что инвариантные шаги алгоритма будут выполнены в AbstractClass.

Пример кода на Java

В примере шаблонный метод реализуется для игр.

package com.designpatterns.templatemethod;
 
/*      Коды разновидностей игр.
 *
 *      Файл GameCode.java      
 * */
 
public enum GameCode {
        CHESS,
        MONOPOLY
}
 
package com.designpatterns.templatemethod;
 
/*      Абстрактный класс, реализация абстрактных методов которого будет специфичной для каждого вида игры. 
 *
 *      Файл Game.java
 * */
 
public abstract class Game {
 
        private int playersAmount;
 
        protected abstract void initializeGame();
 
        protected abstract void playGame();
 
        protected abstract void endGame();
 
        protected abstract void printWinner();
 
        public void playOneGame(int playersAmount){
                setPlayersAmount(playersAmount);
 
                initializeGame();
                playGame();
                endGame();
 
                printWinner();
        }
 
        public void setPlayersAmount(int playersAmount){
                this.playersAmount = playersAmount;
        }
 
}
 
package com.designpatterns.templatemethod;
 
/*      Игра "Шахматы". Специфически только для шахмат реализует методы класса Game.
 *
 *      Файл Chess.java
 * */
 
public class Chess extends Game {
 
        @Override
        protected void initializeGame() {
                // chess specific initialization actions
        }
 
        @Override
        protected void playGame() {
                // chess specific play actions
        }
 
        @Override
        protected void endGame() {
                // chess specific actions to end a game
        }
 
        @Override
        protected void printWinner() {
                // chess specific actions to print winner
        }
 
}
 
package com.designpatterns.templatemethod;
 
/*      Игра "Монополия". Специфически только для монополии реализует методы класса Game.
 *
 *      Файл Monopoly.java
 * */
 
public class Monopoly extends Game{
 
        @Override
        protected void initializeGame() {
                // monopoly specific initialization actions
        }
 
        @Override
        protected void playGame() {
                // monopoly specific play actions
        }
 
        @Override
        protected void endGame() {
                // monopoly specific actions to end a game
        }
 
        @Override
        protected void printWinner() {
                // monopoly specific actions to print winner
        }
 
}
 
package com.designpatterns.templatemethod;
 
/*      Класс, показывающий работу шаблона проектирования "Шаблонный метод".
 *
 *      Файл GamesManager.java
 * */
 
public class GamesManager {
 
        public static void main (String [] args){
                final GameCode gameCode = GameCode.CHESS;
 
                Game game;
 
                switch (gameCode){
                        case CHESS : 
                                game = new Chess();  
                                break;
                        case MONOPOLY : 
                                game = new Monopoly();  
                                break;
                        default :
                                throw new IllegalStateException();
                }
 
                game.playOneGame(2);
        }
 
}

Пример кода на C#

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

/**
 * 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.
 */
 
namespace Design_Patterns
{
    class TemplateMethodPattern
    {
        internal abstract class GameObject
        {
            protected int PlayersCount;
 
            abstract protected void InitializeGame();
 
            abstract protected void MakePlay(int player);
 
            abstract protected bool EndOfGame();
 
            abstract protected void PrintWinner();
 
            /* A template method : */
            public void PlayOneGame(int playersCount)
            {
                PlayersCount = playersCount;
                InitializeGame();
 
                var j = 0;
 
                while (!EndOfGame())
                {
                    MakePlay(j);
                    j = (j + 1) % playersCount;
                }
 
                PrintWinner();
            }
        }
 
        //Now we can extend this class in order to implement actual games:
 
        public class Monopoly : GameObject
        {
            /* Implementation of necessary concrete methods */
 
            protected override void InitializeGame()
            {
                // Initialize money
            }
 
            protected override void MakePlay(int player)
            {
                // Process one turn of player
            }
 
            protected override bool EndOfGame()
            {
                return true;
            }
 
            protected override void PrintWinner()
            {
                // Display who won
            }
 
            /* Specific declarations for the Monopoly game. */
 
            // ...
 
        }
 
        public class Chess : GameObject
        {
 
            /* Implementation of necessary concrete methods */
 
            protected override void InitializeGame()
            {
                // Put the pieces on the board
            }
 
            protected override void MakePlay(int player)
            {
                // Process a turn for the player
            }
 
            protected override bool EndOfGame()
            {
                return true;
                // Return true if in Checkmate or Stalemate has been reached
            }
 
            protected override void PrintWinner()
            {
                // Display the winning player
            }
 
            /* Specific declarations for the chess game. */
 
            // ...
 
        }
 
        public static void Test()
        {
            GameObject game = new Monopoly();
 
            game.PlayOneGame(2);
        }
    }
}

Литература

  • Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссидес Приемы объектно-ориентированного проектирования. Паттерны проектирования = 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 |


Wikimedia Foundation. 2010.

Игры ⚽ Поможем написать реферат

Полезное


Смотреть что такое "Шаблонный метод (шаблон проектирования)" в других словарях:

  • Фабричный метод (шаблон проектирования) — Шаблон проектирования Фабричный метод Factory Method Тип: порождающий Описан в Design Patterns Да Фабричный метод (англ. Factory Method)  порождающий шаблон проектирования, предоставляющий подклассам интерфейс для созда …   Википедия

  • Шаблон проектирования — У этого термина существуют и другие значения, см. Паттерн. В разработке программного обеспечения, шаблон проектирования или паттерн (англ. design pattern) повторимая архитектурная конструкция, представляющая собой решение проблемы… …   Википедия

  • Абстрактная фабрика (шаблон проектирования) — Шаблон проектирования Абстрактная фабрика Abstract factory Тип: порождающий Описан в Design Patterns Да Абстрактная фабрика (англ. Abstract factory) порождающий шаблон проектирования, позволяющий изменять поведение системы …   Википедия

  • Отложенная инициализация (шаблон проектирования) — Отложенная (ленивая) инициализация (англ. Lazy initialization). Приём в программировании, когда некоторая ресурсоёмкая операция (создание объекта, вычисление значения) выполняется непосредственно перед тем, как будет использован её результат.… …   Википедия

  • Интерфейс (шаблон проектирования) — Шаблон проектирования Интерфейс Interface Описан в Design Patterns Нет В информатике, шаблон интерфейса не является особым шаблоном среди шаблонов проектирования. Он является общим методом для структурирования компьютерных программ для того …   Википедия

  • Итератор (шаблон проектирования) — Шаблон проектирования Итератор Iterator Тип: поведенческий Описан в Design Patterns Да Шаблон Iterator (также известный как Cursor)  Шаблон проектирования, относится к паттернам поведения. Представляет собой объект, позволяющий получить …   Википедия

  • Хранитель (шаблон проектирования) — Шаблон проектирования Хранитель Memento Тип: поведенческий Описан в Design Patterns Да Хранитель (также известный как Memento, Token, Лексема) поведенческий шаблон проектирования. Позволяет, не нарушая инкапсуляцию, зафикс …   Википедия

  • Интерпретатор (шаблон проектирования) — Шаблон проектирования Интерпретатор Interpreter Тип: поведенческий Назначение: решает часто встречающуюся, подверженную изменениям задачу Описан в Design Patterns Да Шаблон Интерпретатор (англ.  …   Википедия

  • Компоновщик (шаблон проектирования) — Шаблон проектирования Компоновщик Composite Тип: структурный Описан в Design Patterns Да Компоновщик (англ. Composite pattern) шаблон проектирования, относится к структурным паттернам, объединяет объек …   Википедия

  • Состояние (шаблон проектирования) — Шаблон проектирования Состояние State Тип: поведенческий Описан в Design Patterns Да Состояние (англ. State)  шаблон проектирования. Используется в тех случаях, когда во время выполнения программы объект …   Википедия


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»