предисловие
Только лысая голова может стать сильнее.
Текст был включен в мой репозиторий GitHub, добро пожаловать, звезда:GitHub.com/Zhongf UC очень…
В прошлой статье читатель сказал, что фасадный режим был прочитан за одну минуту, поэтому сегодняшнее название — «Изучите режим шаблонного метода за одну минуту».
Просмотрите шаблоны проектирования, которые я написал ранее:
- Объясни своей девушке, что такое прокси-режим
- Режим упаковки так прост
- Сколько способов вы знаете шаблон singleton?
- Вы понимаете заводскую схему?
- Режим стратегии оказался таким простым!
- Три минуты, чтобы изучить режим фасада!
Будь то собеседование или личное совершенствование, шаблоны проектирования необходимо изучить. Давайте объясним сегодняшаблонный методрежим~
1. Паттерн шаблонного метода
1.1 Реалистичный пример шаблона метода шаблона
Всем известно, что каждый раз, когда я пишу оригинальную техническую статью, я всегда начинаю с «Только лысая голова может стать сильнее». Конечно, я не могу копировать это предложение каждый раз, когда пишу статью (потому что это слишком хлопотно).
У меня есть собственный шаблон письма, на который вы можете взглянуть:
Предисловие и конец фиксированы, а что касается первого и второго пунктов, то это зависит от того, какая статья написана, и содержание, соответствующее разным статьям, тоже разное.
Каждый раз, когда я пишу статью, я просто добавляю в этот шаблон то, что хочу написать, поэтому мне не нужно каждый раз копировать один и тот же контент, что значительно снижает мою нагрузку.
1.2 Назад в мир кода
Код берется из жизни.Также я могу описать процесс написания статей с кодом.Давайте посмотрим.
3y Каждая статья будет иметь «предисловие» и «окончание», 3y написал эти два модуля.
// 3y的文章模板
public class Java3yWriteArticle {
// 前言
public void introduction() {
System.out.println("只有光头才能变强");
}
// 最后
public void theLast() {
System.out.println("关注我的公众号:Java3y");
}
}
3Y Напишите статью, 3y может использовать это:
// 3y写文章
public static void main(String[] args) {
Java3yWriteArticle writeArticle = new Java3yWriteArticle();
// 前言
writeArticle.introduction();
// 实际内容
System.out.println("大家好,我是3y,今天来给大家分享我写的模板方法模式");
// 最后
writeArticle.theLast();
}
Это функция 3y написания статей.ноХорошо ли это делать? В это время 3-летняя подруга тоже хочет написать статью, и ее статья также хочет иметь два модуля «предисловие» и «заключительный», поэтому шаблон статьи 3-летней подружки выглядит так:
// 3y女朋友的文章模板
public class Java3yGFWriteArticle {
// 前言
public void introduction() {
System.out.println("balabalabalalabalablablalab");
}
// 最后
public void theLast() {
System.out.println("balabalabalalabalablablalab");
}
}
Когда 3-летняя подруга пишет статью, она может использовать ее так:
// 3y女朋友写文章
public static void main(String[] args) {
Java3yGFWriteArticle java3yGFWriteArticle = new Java3yGFWriteArticle();
// 前言
java3yGFWriteArticle.introduction();
// 实际内容
System.out.println("3y是傻子,不用管他");
// 最后
java3yGFWriteArticle.theLast();
}
Можно обнаружить, что когда 3-летние и 3-летние подруги хотят написать статьи, им нужно неоднократно звонить.introduction();
а такжеtheLast();
. Более того, "предисловие" и "финал" в шаблоне статьи 3y и шаблоне статьи 3y's girlfriend отличаются только содержанием реализации, но определены дважды, что очевидно.повторяющийся код. Что мы делаем, когда сталкиваемся с повторяющимся кодом? очень простой,извлекатьпублично заявить!
Таким образом, мы можем извлечьУниверсальныйWriteArticle (для удобства вызова мы также напишем шаги статьиупаковкав метод):
// 通用模板
public abstract class WriteArticle {
// 每个人的“前言”都不一样,所以抽象(abstract)
protected abstract void introduction();
// 每个人的“最后”都不一样,所以抽象(abstract)
protected abstract void theLast();
// 实际要写的内容,每个人的“实际内容”都不一样,所以抽象(abstract)
protected abstract void actualContent();
// 写一篇完整的文章(为了方便调用,我们将这几个步骤分装成一个方法)
public final void writeAnCompleteArticle() {
// 前言
introduction();
// 实际内容
actualContent();
// 最后
theLast();
}
}
Таким образом, шаблон 3y может бытьнаследоватьОбщий шаблон, просто реализуйте то, что вы хотите в общем шаблоне:
// 3y的文章模板
public class Java3yWriteArticle extends WriteArticle {
// 前言
@Override
public void introduction() {
System.out.println("只有光头才能变强");
}
// 最后
@Override
public void theLast() {
System.out.println("关注我的公众号:Java3y");
}
@Override
protected void actualContent() {
System.out.println("大家好,我是3y,今天来给大家分享我写的模板方法模式");
}
}
Точно так же шаблон статьи для 3-летних подружек аналогичен:
// 3y女朋友的文章模板
public class Java3yGFWriteArticle extends WriteArticle {
// 前言
@Override
public void introduction() {
System.out.println("balabalabalalabalablablalab");
}
// 最后
@Override
public void theLast() {
System.out.println("balabalabalalabalablablalab");
}
@Override
protected void actualContent() {
System.out.println("3y是傻子,不用管他");
}
}
Это очень удобно, когда вы действительно хотите написать статью:
// 3y写文章
public static void main(String[] args) {
WriteArticle java3ywriteArticle = new Java3yWriteArticle();
java3ywriteArticle.writeAnCompleteArticle();
}
// 3y女朋友写文章
public static void main(String[] args) {
WriteArticle java3yGFWriteArticle = new Java3yGFWriteArticle();
java3yGFWriteArticle.writeAnCompleteArticle();
}
Ключевые моменты:
- Извлеките общедоступный код.Если функция неопределенна, мы оформляем ее как абстрактный метод.
- Инкапсулируйте функциональность нескольких фиксированных шагов вОдинВ методе очень удобно вызывать этот метод, выставляя его во внешний мир.
Что ж, выше приведен шаблон метода шаблона, это так просто!
1.3 Введение в шаблон метода шаблона
Дзен шаблонов проектирования:
Определяет структуру алгоритма в операции, откладывая некоторые шаги на подклассы. Позволяет подклассам переопределять определенные шаги алгоритма без изменения его структуры.
Основываясь на нашем примере выше, давайте поговорим о значении этого предложения:
- Определяет структуру алгоритма в операции, откладывая некоторые шаги на подклассы.
- В WriteArticle есть метод writeAnCompleteArticle(), определяющий все шаги публикации статьи, но большинство этих шагов абстрактны и должны реализовываться подклассами.
- Позволяет подклассам переопределять определенные шаги алгоритма без изменения его структуры.
- Внешний мир пишет статьи, вызывая метод writeAnCompleteArticle().Если подкласс изменит конкретную реализацию, онкосвенныйИзменены детали алгоритма.
Например, 3г в шаблоне статьиintroduction()
изменилось, "толькопополнитьстать сильнее"
@Override
public void introduction() {
System.out.println("只有充钱才能变强");
}
Мы не трогали код writeAnCompleteArticle(), но при повторном вызове этого метода конкретная реализация изменится (поскольку на writeAnCompleteArticle влияет конкретная реализация подкласса).
Давайте взглянем на общую диаграмму классов шаблона метода шаблона:
В шаблоне метода шаблона также есть несколько терминов, согласно комментариям в нашем примере, я вам представлю:
// 抽象模板类
public abstract class WriteArticle {
// 基本方法
protected abstract void introduction();
// 基本方法
protected abstract void theLast();
// 基本方法
protected abstract void actualContent();
// 模板方法
public final void writeAnCompleteArticle() {
introduction();
actualContent();
theLast();
}
}
// 具体模板类
public class Java3yWriteArticle extends WriteArticle {
// 实现基本方法
@Override
public void introduction() {
System.out.println("只有充钱才能变强");
}
// 实现基本方法
@Override
public void theLast() {
System.out.println("关注我的公众号:Java3y");
}
// 实现基本方法
@Override
protected void actualContent() {
System.out.println("大家好,我是3y,今天来给大家分享我写的模板方法模式");
}
}
- основной метод: реализован в подклассах и вызывается в методах шаблона
- шаблонный метод: определяет кадр,Реализовать вызовы базовых методов и завершить фиксированную логику.
1.4 Преимущества и недостатки шаблонного метода
преимущество:
- Инкапсулировать постоянную часть, расширить переменную часть. Инкапсулируйте алгоритм, который считается инвариантной частью в родительский класс, а переменная часть реализуется подклассом!
- Извлеките код общей части, поведением управляет родительский класс, а реализует его дочерний класс!
недостаток:
- Абстрактный класс определяет некоторые абстрактные методы, эти абстрактные методы реализуются подклассом, и результат выполнения подкласса влияет на результат родительского класса (Подкласс влияет на родительский класс), затруднит чтение кода!
1.5 Приложение шаблона метода JDK
Самым классическим является AQS (AbstractQueuedSynchronizer) в составе пакета JUC. Что такое АКС?
AQS на самом деле является инструментом, который может дать намФреймворк для реализации блокировок. Ключ к внутренней реализации: очередь в порядке очереди, состояние состояния
Мы можем взглянуть на то, что определяет AQS.acquire()
public final void acquire(int arg) {
if (!tryAcquire(arg) &&
acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
selfInterrupt();
}
acquire()
Эквивалент шаблонного метода,tryAcquire(arg)
Эквивалентно основному методу.
В конце концов
Шаблон шаблонного метода также очень прост: абстрактный класс имеет базовые методы (методы, ожидающие реализации в подклассах) и шаблонные методы (открытые для внешнего мира, вызывающие базовые методы и определяющие структуру алгоритма). Это.
Рекомендуемое чтение и ссылки:
- Дзен шаблонов проектирования
- blog.CSDN.net/Carson_Ok/Ах…
- blog.CSDN.net/Добрый дом/Арити…
Рад поделиться и экспортироватьгалантерейные товарыОбщедоступный номер технологии Java: Java3y. Подпишитесь, чтобы получать огромные видеоресурсы!
Отличный обзор:
Я думаю, что моя статья хорошо написана, пожалуйста, нажмитеотличный!