Расскажите о моем понимании шаблона проектирования «метод шаблона» (Шаблон)

задняя часть алгоритм Spring Шаблоны проектирования
Расскажите о моем понимании шаблона проектирования «метод шаблона» (Шаблон)

Во-первых, давайте общаться!

Причина, по которой я захотел написать этот шаблон проектирования метода шаблона, чисто случайна! Зачем? Поскольку я недавно просматривал исходный код фреймворка Spring, у меня сначала немного закружилась голова, потому что вас смутит отношение наследования всех его классов и интерфейсов, но когда вы знаете, какой шаблон проектирования он использует, тогда я хочу сказать Глядя на исходный код еще раз, по крайней мере контур будет намного яснее!

Фреймворк Spring использует множество шаблонов проектирования, таких как модуль Resource, который использует策略模式,事务模块Используя режим шаблонного метода и так далее, я не могу нарадоваться, вы можете сделать это сами.

Далее я объясню, что такое паттерн шаблонного метода, а что касается его применения в Spring, я планирую написать статью, чтобы обобщить его позже!

2. Что такое模板方法Шаблоны проектирования?

模板模式Это шаблон поведенческого проектирования, и идея его реализации заключается в создании模板方法method, определите некоторые основные методы в этом классе шаблона для模板方法methodвызов, эти основные методы обычноprotectedУкрашено, потому что ему не нужно предоставлять доступ к внешнему миру.模板方法methodОпределяет шаги выполнения алгоритма или может предоставить реализацию по умолчанию, которая суммирует общие части некоторых подклассов или всех подклассов (说白了就是概括了所有子类的共同特性,并且自己实现了它).

Говоря о шаблонах проектирования, мне стыдно, что я не публикую UML-диаграммы.

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

wokao, у вора абстракция есть дерево! Ниже я привожу пример, иллюстрирующий это:引用自并发编程网

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

    1. Fundation
    1. Pillars
    1. Walls
    1. Окна.

Самое главное, что этот процесс сборки нельзя изменить (也就是我们不能修改或者重写模板方法的意思), типа невозможно начинать строить окна без фундамента! Если бы это было возможно, это был бы бред! . В этом примере мы создали шаблонный метод, который будет использовать разные методы для завершения строительства дома.

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

HouseTemple.java(这个对应我们上面UML图中的AbstractClass)

package com.journaldev.design.template;
//抽象类
public abstract class HouseTemplate {

    //这是我们的模板方法,子类不能重写
    public final void buildHouse(){
        buildFoundation();//第一步:建造地基
        buildPillars();//第二步,建造支撑
        buildWalls();//第三步,建造墙
        buildWindows();//第四步,建造窗户
        System.out.println("House is built.");
    }

    //这个步骤可以默认实现,原文是private修饰,那么就是说我规定死啦,这个步骤只能这样实现了,但为了易扩展,还是protected OK点
    protected void buildWindows() {
        System.out.println("Building Glass Windows");
    }
    
    //被子类实现的方法
    protected abstract void buildWalls();
    protected abstract void buildPillars();
    
    protected void buildFoundation() {
        System.out.println("Building foundation with cement,iron rods and sand");
    }
}

Ниже приведен конкретный класс реализации:

WoodenHouse.java

package com.journaldev.design.template;

public class WoodenHouse extends HouseTemplate {

    @Override
    public void buildWalls() {
        System.out.println("Building Wooden Walls");
    }
    
    @Override
    public void buildPillars() {
        System.out.println("Building Pillars with Wood coating");
    }
}

GlassHouse.java

package com.journaldev.design.template;</code>

public class GlassHouse extends HouseTemplate {

    @Override
    public void buildWalls() {
        System.out.println("Building Glass Walls");
    }

    @Override
    public void buildPillars() {
        System.out.println("Building Pillars with glass coating");
    }
}

Используя шаблонный метод:

package com.journaldev.design.template;

public class HousingClient {

    public static void main(String[] args) {
        //创建一个模板,子类由WoodenHouse实现
        HouseTemplate houseType = new WoodenHouse();

        houseType.buildHouse();//调用模板方法
        System.out.println("************");
        //创建一个模板,子类由GlassHouse实现
        houseType = new GlassHouse();
        houseType.buildHouse();//调用模板方法
    }
}

В-третьих, характеристики шаблона проектирования метода шаблона

  • 1. Методы шаблона не могут быть переопределены подклассами, доступнымиfinalретушь
  • 2. Шаблонный метод состоит из определенных шагов, которые могут быть реализованы разными подклассами или реализованы сами по себе.

В-четвертых, сценарии применения шаблона шаблонного метода

  • 1. Шаги для бизнес-метода фиксированы, но эти шаги могут быть реализованы по-разному
  • 2. Используется в Spring JdbcTemplate и Spring Transaction.