Шаблон шаблонного метода шаблона проектирования Java определяет структуру рабочего алгоритма и передает некоторые шаги подклассам, так что подклассы могут переопределять определенные конкретные шаги в алгоритме без изменения структуры алгоритма. Поведенческая модель
Как показано ниже:
Фактически, метод шаблона — это часто используемый шаблон в программировании. Давайте сначала рассмотрим пример. Однажды программист А получил задание: дать массив целых чисел, отсортировать числа в массиве от меньшего к большему, а затем распечатать отсортированные результаты. После анализа эту задачу можно условно разделить на две части: сортировку и печать. Функцию печати легко реализовать, но сортировка немного затруднительна. Но у А есть способ сначала выполнить функцию печати и найти кого-нибудь другого, кто выполнит функцию сортировки.
абстрактный класс AbstractSort { /** * Сортировка массива массива от меньшего к большему * @param array */ protected Abstract void sort(int[] array); public void showSortResult(int[] array){ this.sort(array); System.out.print("Результат сортировки: "); for (int i = 0; i < array.length; i++){ System.out.printf("%3s", array[i]);
Закончив писать, А нашел своего коллегу Б, который только что закончил обучение и недавно присоединился к работе, и сказал: «Основную логику я уже написал. Вы можете реализовать ее. Поэтому я передал класс AbstractSort B и попросил B написать реализацию. Б взял его и посмотрел. Это было слишком просто. Это можно было сделать за 10 минут. Код следующий:
класс ConcreteSort расширяет AbstractSort { @Override protected void sort(int[] array){ for(int i=0; i<array.length-1; i++) { selectSort(array, i } } Private void selectSort(int[); ] array, int index) { int MinValue = 32767; // Переменная минимального значения int indexMin = 0 // Переменная индекса минимального значения int Temp; // Переменная временного хранения для (int i = index; i < array.length; i++) { if (array[i] < MinValue){ // Находим минимальное значение MinValue = array[i]; // Сохраняем минимальное значение indexMin = i } } Temp = array[; index] ; // Обменяем два значения array[index] = array[indexMin]; array[indexMin] = Temp;
После написания передайте его A, и A запустит его:
public class Client { public static int[] a = { 10, 32, 1, 9, 5, 7, 12, 0, 4, 3 } // Массив данных по умолчанию public static void main(String[] args){ AbstractSort s = новый ConcreteSort (); s.showSortResult (а }}
Результаты запуска:
Результаты сортировки: 0 1 3 4 5 7 9 10 12 32
Он работает нормально. Ладно, миссия выполнена. Да, это шаблон метода шаблона. Большинство выпускников, только что приступивших к работе, должны иметь опыт, аналогичный опыту B. Для сложной задачи лучшие люди в компании пишут основную логику, а затем записывают, казалось бы, простые методы в абстрактные и оставляют их разработку другим коллегам. Такое разделение труда часто используется в компаниях с очевидным уровнем штата программистов. Например, если в проектной команде есть архитектор, старший инженер и младший инженер, архитектор обычно будет использовать большое количество интерфейсов и абстрактных классов для объединения логики всей системы, а код реализации будет передан Это делают старший инженер и младший инженер соответственно в зависимости от сложности. Как насчет этого, вы когда-нибудь использовали шаблон метода шаблона?
Структура шаблона шаблонного метода:
Шаблон шаблонного метода состоит из абстрактного класса и одного (или группы) классов реализации через структуру наследования. Методы абстрактного класса делятся на три типа:
1. Абстрактный метод : он объявлен только в родительском классе, но не реализован. Вместо этого спецификация определяется, а затем реализуется ее подклассами.
2. Метод шаблона : объявлен и реализован абстрактным классом. Вообще говоря, методы шаблона вызывают абстрактные методы для выполнения основных логических функций, а большинство методов шаблона определяются как конечные типы, что указывает на то, что основные логические функции не могут быть переопределены в подклассах.
3. Метод-перехватчик : объявлен и реализован абстрактным классом. Но подклассы могут быть расширены, а подклассы могут влиять на логику методов шаблона, расширяя методы-перехватчики.
Задача абстрактных классов — построить логическую структуру, которую обычно пишут опытные специалисты, поскольку от качества абстрактных классов напрямую зависит стабильность программы.
Классы реализации используются для реализации деталей. Метод шаблона в абстрактном классе завершает бизнес-логику, реализуя метод расширения класса. Пока метод расширения в классе реализации проходит модульное тестирование и метод шаблона корректен, в общей функции обычно не возникает серьезных ошибок.
Преимущества и применимые сценарии шаблонного метода:
Легко расширить. Вообще говоря, шаблонный метод в абстрактном классе — это та часть, которую нелегко изменить задним числом, тогда как абстрактный метод — это та часть, которую легко изменить задним числом. Поэтому, добавляя классы реализации, обычно легко расширить функцию. , что соответствует принципу открытия и закрытия.
Легко обслуживать. Для шаблонного метода именно потому, что их основная логика одинакова, используется шаблонный метод. Если шаблонный метод не используется, один и тот же код может быть разбросан по разным классам, что очень неудобно поддерживать. .
Более гибкий. Из-за метода перехвата реализация подкласса также может повлиять на работу основной логики родительского класса. Однако, будучи гибким, поскольку подкласс влияет на родительский класс, он нарушает принцип замены Лискова, а также несет риски для программы. Это предъявляет более высокие требования к проектированию абстрактных классов.
Если несколько подклассов имеют один и тот же метод и логика этих методов одинакова, вы можете рассмотреть возможность использования шаблонного метода метода. Этот режим также больше подходит для ситуаций, когда основная структура программы одинакова, но детали разные.