Шаблонный шаблонный шаблон является шаблоном поведенческого проектирования, который обеспечивает базовый метод для алгоритма, называемый шаблонным методом, который откладывает некоторые его этапы до подклассов. Таким образом, структура алгоритма является такой же, но некоторые из его этапов могут быть переопределены подклассами в соответствии с контекстом.
Шаблон означает предустановленный формат, такой как шаблоны HTML, который имеет фиксированный предустановленный формат. Аналогично в шаблоне метода шаблона у нас есть предустановленный метод структуры, называемый шаблонным методом, который состоит из шагов. Эти шаги могут быть абстрактным методом, который будет реализован его подклассами.
Короче говоря, вы можете сказать, что в шаблоне метода шаблона есть метод шаблона, который определяет набор шагов, и реализация шагов может быть отложена до подклассов. Этот метод шаблона определяет алгоритм, но точные шаги могут быть определены в подклассах.
Когда его использовать:
- Если у вас есть предустановленный формат или шаги для алгоритма, но реализация шагов может отличаться.
- Если вы хотите избежать дублирования кода, используйте общий код в базовом классе и вариации в подклассе.
Состав:
Таким образом, на приведенной выше диаграмме, как вы можете видеть, мы определили метод шаблона с тремя шагами, то есть операция1, операция2 и операция3. Среди них операции opeation1 и операция2 являются абстрактными шагами, поэтому они реализованы с помощью ConcreteClass. Мы реализовали операцию 3 здесь. Вы можете реализовать операция в базовом классе в двух сценариях, во-первых, если она является общей для всех, и, во-вторых, если это реализация по умолчанию этого метода. Диаграмма UML теперь будет намного понятнее.
Компоненты:
AbstractClass
- Он определяет шаблонный метод, определяющий структуру алгоритма.
- Он также определяет абстрактные операции, которые будут реализованы подклассами для определения шагов алгоритма.
ConcreteClass
- Он реализует абстрактную операцию суперкласса для выполнения определенных шагов подкласса алгоритма, а также переопределяет операцию, если поведение по умолчанию не требуется
Важные моменты о шаблоне метода шаблона:
- Шаблонный метод в суперклассе следует « голливудскому принципу »: « Не звоните нам, мы вам позвоним ». Это относится к тому факту, что вместо вызова методов из базового класса в подклассах, методы из подкласса вызываются в методе шаблона из суперкласса.
- Шаблонный метод в суперклассе не должен быть переопределен, поэтому сделайте его окончательным
- Хуки настройки : методы, содержащие реализацию по умолчанию, которая может быть переопределена в других классах, называются методами хуки. Методы хуков предназначены для переопределения, а конкретные методы — нет. Так что в этом шаблоне мы можем предоставить методы хуков. Проблема в том, что иногда становится очень трудно различить методы хуков и конкретные методы.
- Шаблонные методы являются техникой для повторного использования кода, потому что с этим вы можете выяснить общее поведение и отложить определенное поведение подклассам.
Пример:
Давайте рассмотрим пример. Когда вам нужно читать из двух источников данных, то есть из CSV и базы данных, вам нужно обработать эти данные и сгенерировать вывод в виде файлов CSV. Здесь выполняются три шага.
- Чтение данных из источника данных
- Обрабатывать данные
- Записать вывод в файлы CSV
Java-код:
Класс ниже содержит шаблонный метод parseDataAndGenerateOutput, который состоит из шагов для чтения данных, обработки данных и записи в CSV-файл.
1.DataParser.java
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
|
package org.arpit.javapostsforlearning; abstract public class DataParser { //Template method //This method defines a generic structure for parsing data public void parseDataAndGenerateOutput() { readData(); processData(); writeData(); } //This methods will be implemented by its subclass abstract void readData(); abstract void processData(); //We have to write output in a CSV file so this step will be same for all subclasses public void writeData() { System.out.println( 'Output generated,writing to CSV' ); } } |
В следующем классе в этом классе реализованы конкретные шаги CSV
2.CSVDataParser.java
01
02
03
04
05
06
07
08
09
10
11
|
package org.arpit.javapostsforlearning; public class CSVDataParser extends DataParser { void readData() { System.out.println( 'Reading data from csv file' ); } void processData() { System.out.println( 'Looping through loaded csv file' ); } } |
В следующем классе в этом классе реализованы специфичные для базы данных
3.DatabaseDataParser.java
01
02
03
04
05
06
07
08
09
10
11
12
|
package org.arpit.javapostsforlearning; public class DatabaseDataParser extends DataParser { void readData() { System.out.println( 'Reading data from database' ); } void processData() { System.out.println( 'Looping through datasets' ); } } |
4.TemplateMethodMain.java
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
package org.arpit.javapostsforlearning; public class TemplateMethodMain { /** * @author arpit mandliya */ public static void main(String[] args) { CSVDataParser csvDataParser= new CSVDataParser(); csvDataParser.parseDataAndGenerateOutput(); System.out.println( '**********************' ); DatabaseDataParser databaseDataParser= new DatabaseDataParser(); databaseDataParser.parseDataAndGenerateOutput(); } } |
выход:
1
2
3
4
5
6
7
|
Reading data from csv file Looping through loaded csv file Output generated,writing to CSV ********************** Reading data from database Looping through datasets Output generated,writing to CSV |
Используется в Java API:
- Все неабстрактные методы
java.io.InputStream
,java.io.OutputStream
,java.io.Reader
иjava.io.Writer
. - Все неабстрактные методы
java.util.AbstractList
,java.util.AbstractSet
иjava.util.AbstractMap
. -
javax.servlet.http.HttpServlet
, все методыdoXXX()
по умолчанию отправляют в ответ ошибку HTTP 405 «Метод не разрешен». Вы свободны, чтобы реализовать ни один или любой из них.
Исходный код: Скачать
Ссылка: Шаблон разработки шаблонов методов на языке Java от нашего партнера по JCG Арпит Мандлия из раздела Java-фреймворки и шаблоны проектирования для начинающих