Что такое паттерн проектирования шаблонного метода?
Программирование

Что такое паттерн проектирования шаблонного метода?

Используйте силу абстрактных и конечных методов для сохранения контроля над реализацией подклассов

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

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

Подкласс может реализовать абстрактный метод, но он не может переопределить алгоритм, реализуемый конечным методом

Как работает метод шаблона

Типичный шаблон шаблонного метода имеет следующую структуру:

final void templateMethod() {
abstractOperation1();
abstractOperation2();

concreteOperation1();
concreteOperation2();

hook();
}

Первое, что важно отметить, это то, что templateMethod() является final, поэтому ни один подкласс не может переопределить этот метод. Другой важный момент – три типа методов, которые использует шаблонный метод: конкретный, абстрактный и крючок

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

Реализация шаблона шаблонного метода в Java

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

Например, вы можете подключить свое приложение к одной из многих систем баз данных. Шаги по подключению к базе данных и ее использованию следуют аналогичному шаблону:

public abstract class Database {
// template method
final void databaseTemplate() {
// abstract methods
setDBDriver();
setCredentials();

// concrete method
connect();

// abstract methods
createDB();
setData();
readData();

// hook methods
if (userWantsToUpdate()) {
updateData();
}

if (userWantsToDelete()) {
deleteData();
}

// concrete method
closeConnection();
}

abstract void setDBDriver();
abstract void setCredentials();
abstract void createDB();
abstract void setData();
abstract void readData();
abstract void updateData();
abstract void deleteData();

void connect() {
System.out.println('Connecting to database.');
}

void closeConnection() {
System.out.println('Destroying database connection.');
}

boolean userWantsToUpdate() {
return false;
}

boolean userWantsToDelete() {
return false;
}
}

Этот пример класса Database использует шаблон метода шаблона для создания шаблона, который можно использовать с любой базой данных. Чтобы использовать базу данных, ваше приложение должно подключиться к ней, а затем уничтожить соединение после использования. Эти действия обычно одинаковы для всех баз данных. Поэтому абстрактный класс Database может реализовать методы connect() и closeConnection()

Другие методы в шаблоне метода будут отличаться в зависимости от типа базы данных. Например, база данных MySQL хранит данные в таблицах, а база данных MongoDB – в коллекциях. Если вы хотите использовать базу данных MySQL в Java, просто создайте новый класс MySQL, который расширяет класс Database:

public class MySQL extends Database {
@Override
void setDBDriver() {
System.out.println('Selecting MySQL driver.');
}

@Override
void setCredentials() {
System.out.println('Setting MySQL database Credential.');
}

@Override
void createDB() {
System.out.println('Creating a new table.');
}

@Override
void setData() {
System.out.println('Inserting data into database.');
}

@Override
void readData() {
System.out.println('Retrieving data from database.');
}

@Override
void updateData() {
System.out.println('Updating data in database.');
}

@Override
void deleteData() {
System.out.println('Deleting data from database.');
}
}

Класс MySQL реализует все абстрактные методы класса Database. Он также может переопределять некоторые конкретные методы. Однако он не может касаться метода databaseTemplate(), который использует ключевое слово final

public class Main {
public static void main(String[] args) {
Database mySQLDB = new MySQL();
mySQLDB.databaseTemplate();
}
}

Этот класс Main создает новый объект базы данных MySQL и использует метод шаблона для имитации подключения приложения к базе данных. Запуск метода main выводит на консоль следующий вывод:

В выводе можно заметить, что приложение никогда не вызывает методы updateData() и deleteData(). Вот почему методы hook важны. В базе данных SQL вы захотите создавать новые таблицы, вставлять данные и просматривать их. Однако, возможно, вы не захотите обновлять или удалять данные. Поэтому методы hook дают подклассам возможность контролировать эти критические аспекты алгоритма

@Override
boolean userWantsToUpdate() {
return true;
}

Просто добавив приведенный выше код в класс MySQL, приложение теперь обновляет данные в базе данных. Если вы снова запустите класс Main, он отобразит следующий обновленный вывод:

Как вы можете видеть, приложение теперь обновляет данные в Базе Данных

Преимущества использования паттерна проектирования шаблонного метода

Основным преимуществом шаблона шаблонного метода является то, что он способствует повторному использованию программного обеспечения. Этот шаблон проектирования также поддерживает эффективное программирование. Подкласс должен реализовывать только те методы, которые уникальны для его работы

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

Об авторе

Алексей Белоусов

Привет, меня зовут Филипп. Я фрилансер энтузиаст . В свободное время занимаюсь переводом статей и пишу о потребительских технологиях для широкого круга изданий , не переставая питать большую страсть ко всему мобильному =)

Комментировать

Оставить комментарий