Статьи

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

Шаблонный шаблонный шаблон является шаблоном поведенческого проектирования, который обеспечивает базовый метод для алгоритма, называемый шаблонным методом, который откладывает некоторые его этапы до подклассов. Таким образом, структура алгоритма является такой же, но некоторые из его этапов могут быть переопределены подклассами в соответствии с контекстом.

Шаблон означает предустановленный формат, такой как шаблоны HTML, который имеет фиксированный предустановленный формат. Аналогично в шаблоне метода шаблона у нас есть предустановленный метод структуры, называемый шаблонным методом, который состоит из шагов. Эти шаги могут быть абстрактным методом, который будет реализован его подклассами.

Короче говоря, вы можете сказать, что в шаблоне метода шаблона есть метод шаблона, который определяет набор шагов, и реализация шагов может быть отложена до подклассов. Этот метод шаблона определяет алгоритм, но точные шаги могут быть определены в подклассах.

Когда его использовать:

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

Состав:

Таким образом, на приведенной выше диаграмме, как вы можете видеть, мы определили метод шаблона с тремя шагами, то есть операция1, операция2 и операция3. Среди них операции opeation1 и операция2 являются абстрактными шагами, поэтому они реализованы с помощью ConcreteClass. Мы реализовали операцию 3 здесь. Вы можете реализовать операция в базовом классе в двух сценариях, во-первых, если она является общей для всех, и, во-вторых, если это реализация по умолчанию этого метода. Диаграмма UML теперь будет намного понятнее.

Компоненты:

AbstractClass

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

ConcreteClass

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

Важные моменты о шаблоне метода шаблона:

  • Шаблонный метод в суперклассе следует « голливудскому принципу »: « Не звоните нам, мы вам позвоним ». Это относится к тому факту, что вместо вызова методов из базового класса в подклассах, методы из подкласса вызываются в методе шаблона из суперкласса.
  • Шаблонный метод в суперклассе не должен быть переопределен, поэтому сделайте его окончательным
  • Хуки настройки : методы, содержащие реализацию по умолчанию, которая может быть переопределена в других классах, называются методами хуки. Методы хуков предназначены для переопределения, а конкретные методы — нет. Так что в этом шаблоне мы можем предоставить методы хуков. Проблема в том, что иногда становится очень трудно различить методы хуков и конкретные методы.
  • Шаблонные методы являются техникой для повторного использования кода, потому что с этим вы можете выяснить общее поведение и отложить определенное поведение подклассам.

Пример:

Давайте рассмотрим пример. Когда вам нужно читать из двух источников данных, то есть из CSV и базы данных, вам нужно обработать эти данные и сгенерировать вывод в виде файлов CSV. Здесь выполняются три шага.

  1. Чтение данных из источника данных
  2. Обрабатывать данные
  3. Записать вывод в файлы 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 от нашего партнера по JCG Арпит Мандлия из раздела Java-фреймворки и шаблоны проектирования для начинающих