Patrón de método de plantilla del patrón de diseño de Java (12)

¡La lucha no es necesariamente todo por dinero, sino también la confianza, la tranquilidad y la tranquilidad en los huesos! Puedo permitirme lo que me gusta, ir a donde quiero ir y ser capaz de asumir la responsabilidad, gastar mi dinero y vivir. calidad de vida! Sea usted mismo insustituible!

definición

El patrón del método de plantilla define los pasos de un algoritmo y permite que las subcategorías proporcionen práctica para uno o más pasos. Deje que la subcategoría redefina algunos pasos en el algoritmo sin cambiar la arquitectura del algoritmo. En ingeniería de software, es un patrón de diseño de software y no tiene conexión con las plantillas de C ++.

Aprendizaje de patrones de diseño ,
escribiré en un blog sobre 23 patrones de diseño en un futuro cercano , así que estad atentos ~ —15/01/2021

Enciclopedia de Baidu

escenas que se utilizarán

Quiero hacer leche de soja, primero necesito:

  • Preparar soja
  • Prepare frijoles rojos, soja, frijoles negros
  • Agrega azúcar de roca
  • Pulido en leche de soja

Se divide a grandes rasgos en estos pasos.

En general, el proceso de producción de la leche de soja es básicamente el mismo, pero los ingredientes son diferentes. Quiero beber leche de soja de frijoles rojos, pongo frijoles rojos, quiero beber pasta de frijoles de soja, pongo soja y finalmente puedes Elija agregar o no agregar azúcar de roca. Aquí viene el modo de método de plantilla.

Análisis de pensamiento

El patrón del método de plantilla es estandarizar el flujo de código definiendo una plantilla

UML类图(1.1):
Inserte la descripción de la imagen aquí
Al definir el método abstracto ATemplate para estandarizar el proceso de producción de leche de soja, su subclase BlackSoybeanMilkImpl implementa qué tipo de frijoles poner, y si pones frijoles negros aquí, obtendrás leche de soja negra.

Análisis de roles

  • ATemplate (clase abstracta): la plantilla se implementa en la clase, se define el esqueleto de pensamiento de código general y se implementan las subclases de código específicas.
  • BlackSoybeanMilkImpl (clase de implementación): implementa el código específico
  • Cliente: el cliente llama directamente a la clase de implementación y luego usa el mecanismo polimórfico para llamar al método de plantilla de la clase principal

Código

La clase abstracta ATemplate define la especificación del código:

public abstract class ATemplate {
    
    

    //用来规范豆浆流程
    void aemplate() {
    
    
        soybean();//准备黄豆
        addBean();//添加豆子
        sugar();  //准备冰糖
        polish(); //打豆浆
    }
    //准备黄豆
   private void soybean() {
    
    
        Log.i("模板方法模式 ","准备黄豆");
    }

    //添加豆子
    public abstract void addBean();

    //准备冰糖
    private void sugar() {
    
    
        Log.i("模板方法模式 ","放入冰糖");
    }

    //打豆浆
    private void polish() {
    
    
        Log.i("模板方法模式 ","开始打磨豆浆 预计10分钟完毕");
    }
}

Implementación del frijol negro BlackSoybeanMilkImpl:

public class BlackSoybeanMilkImpl extends ATemplate{
    
    

    @Override
    public void addBean() {
    
    
        Log.i("模板方法模式 ","放入 黑豆浆");
    }
}

Implementación de RedSoybeanMilkImpl Soybean:

public class RedSoybeanMilkImpl extends ATemplate{
    
    
    @Override
    public void addBean() {
    
    
        Log.i("模板方法模式 ","放入 红豆浆");
    }
}

Cliente (código de prueba):

//制作黑豆浆
ATemplate blackSoybeanMilk = new BlackSoybeanMilkImpl();
blackSoybeanMilk.aemplate();

Log.i("模板方法模式 "," ===========================");

//制作红豆浆
RedSoybeanMilkImpl redSoybeanMilk = new RedSoybeanMilkImpl();
redSoybeanMilk.aemplate();

Log图(2.1):
Inserte la descripción de la imagen aquí

Comprensión del método de gancho

Aún en el ejemplo anterior, si quiero beber leche de soja pura sin azúcar, usaré el gancho aquí ".

Función de método de gancho: identifica si se debe ejecutar una determinada pieza de código;

Implementación de código de gancho

ATemplate agrega el método de gancho isSugar ():

public abstract class ATemplate {
    
    
    //用来规范豆浆流程
    void aemplate() {
    
    
        soybean();//准备黄豆
        addBean();//添加豆子
        if (isSugar()) {
    
    
            sugar();  //准备冰糖
        }
        polish(); //打豆浆
    }
    //准备黄豆
    private void soybean() {
    
    
        Log.i("模板方法模式 ", "准备黄豆");
    }

    //添加豆子
    public abstract void addBean();

    //准备冰糖
    private void sugar() {
    
    
        Log.i("模板方法模式 ", "放入冰糖");
    }

    //打豆浆
    private void polish() {
    
    
        Log.i("模板方法模式 ", "开始打磨豆浆 预计10分钟完毕");
    }

    //默认加糖 钩子方法
    public boolean isSugar() {
    
    
        return true;
    }
}

PureSoybeanMilkImpl producción de leche de soja pura:

Vuelva a escribir el método de gancho () y modifíquelo sin azúcar:

public class PureSoybeanMilkImpl extends ATemplate{
    
    
    @Override
    public void addBean() {
    
    
        Log.i("模板方法模式 ","我这里什么都不加,我要喝纯豆浆");
    }
    //不加糖
    @Override
    public boolean isSugar() {
    
    
        return false;
    }
}

Cliente (código de prueba):

//制作黑豆浆
ATemplate blackSoybeanMilk = new BlackSoybeanMilkImpl();
blackSoybeanMilk.aemplate();

Log.i("模板方法模式 "," ===========================");

//制作红豆浆
RedSoybeanMilkImpl redSoybeanMilk = new RedSoybeanMilkImpl();
redSoybeanMilk.aemplate();


Log.i("模板方法模式 "," ===========================");

//制作纯豆浆  使用钩子 不加糖
PureSoybeanMilkImpl pureSoybeanMilk = new PureSoybeanMilkImpl();
pureSoybeanMilk.aemplate();

Log图(2.2):
Inserte la descripción de la imagen aquí

para resumir:

  • El patrón del método de plantilla es relativamente simple, es decir, el flujo de código está estandarizado a través de una clase abstracta, y los lugares específicos que deben cambiarse se escriben como métodos abstractos y dejan que sus subclases los implementen.

  • Un gancho es una 'variable de método' en la clase abstracta del método de plantilla, que identifica si se debe ejecutar una determinada pieza de código;

Código completo

Ir a la página de inicio de Patrones de diseño / Principios de diseño

La originalidad no es fácil, tus me gusta son tu mayor apoyo para mí ~

Supongo que te gusta

Origin blog.csdn.net/weixin_44819566/article/details/112651624
Recomendado
Clasificación