Изучите «Шаблон метода шаблона» за одну минуту

Java

предисловие

Только лысая голова может стать сильнее.

Текст был включен в мой репозиторий GitHub, добро пожаловать, звезда:GitHub.com/Zhongf UC очень…

В прошлой статье читатель сказал, что фасадный режим был прочитан за одну минуту, поэтому сегодняшнее название — «Изучите режим шаблонного метода за одну минуту».

Просмотрите шаблоны проектирования, которые я написал ранее:

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

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)Эквивалентно основному методу.

tryAcquire方法被多个子类实现

В конце концов

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

Рекомендуемое чтение и ссылки:

Рад поделиться и экспортироватьгалантерейные товарыОбщедоступный номер технологии Java: Java3y. Подпишитесь, чтобы получать огромные видеоресурсы!

帅的人都关注了

Отличный обзор:

Я думаю, что моя статья хорошо написана, пожалуйста, нажмитеотличный!