- Шаблонный метод (шаблон проектирования)
-
Шаблон проектирования Шаблонный метод Template method Тип: поведенческий
Описан в Design Patterns Да
Шаблонный метод (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)
Ссылки
- Паттерн Template Method (шаблонный метод) — назначение, описание, особенности и реализация на С++.
Шаблоны проектирования Основные Порождающие Структурные Поведенческие Интерпретатор • Итератор • Команда • Наблюдатель • Посетитель • Посредник • Состояние • Стратегия • Хранитель • Цепочка обязанностей • Шаблонный метод
Блокировка с двойной проверкой • Однопоточное выполнение • Планировщик Поведенческие шаблоны проектирования 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.