Un artículo sobre el diseño de la arquitectura, el patrón de diseño de Java 9, el patrón del método de plantilla

inserte la descripción de la imagen aquí

1. Patrón de método de plantilla

El patrón Template Method expone una plantilla en una clase abstracta que define un método que la ejecuta. Sus subclases pueden anular la implementación del método según sea necesario, pero las llamadas se realizarán según lo definido en la clase abstracta.

En pocas palabras, es definir el esqueleto del algoritmo de una operación y retrasar la implementación de algunos pasos en las subclases, de modo que las subclases puedan redefinir algunos pasos de un algoritmo sin cambiar la estructura del algoritmo.

En segundo lugar, la estructura del patrón del método de plantilla.

Clase abstracta WorkDay: defina un método de plantilla work(), que define el esqueleto de la lógica de nivel superior, que es un proceso secuencial, que incluye varios métodos abstractos, que se difieren a la implementación de la subclase.

Las subclases anularán estos métodos abstractos 吃早饭eat()、早会earlyMeeting()、工作计划workPlan()、摸鱼fish()para implementar el proceso esqueleto de manera concreta.

En tercer lugar, las ventajas y desventajas del patrón del método de plantilla.

1. Ventajas

  1. El patrón del método de plantilla elimina la duplicación de código en las subclases al mover el comportamiento constante a la clase principal.
  2. La subclase implementa algunos detalles del algoritmo, lo que es útil para la extensión del algoritmo.
  3. Llamar a las operaciones implementadas por una subclase a través de una clase principal y agregar nuevos comportamientos a través de la extensión de la subclase se ajusta al "principio abierto-cerrado".

2. Desventajas

De acuerdo con los hábitos de diseño, la clase abstracta se encarga de declarar los atributos y métodos de las cosas más abstractas y generales, y la clase de implementación se encarga de completar los atributos y métodos específicos de transacción, pero el método plantilla es todo lo contrario, el resultado de la ejecución de la subclase afecta el resultado de la clase principal, lo que aumentará la dificultad de lectura del código.

En cuarto lugar, el uso del patrón del método de plantilla.

1. Múltiples subclases tienen métodos comunes y la lógica es básicamente la misma.

2. Para algoritmos importantes y complejos, el algoritmo central se puede diseñar como un método de plantilla, y cada subclase implementa las funciones detalladas que lo rodean.

3. Al refactorizar, el método de plantilla es un método de uso frecuente, extrae el mismo código en la clase principal y luego restringe su comportamiento a través del constructor.

5. Implemente la clase abstracta WorkDay a través del patrón del método de plantilla

1. Clase abstracta de nivel superior

package com.guor.template;

/**
 * 程序员的一天
 */
public abstract class WorkDay {
    
    

    String name;   // 姓名
    String job;  // 工作

    public WorkDay(String name, String job) {
    
    
        this.name = name;
        this.job = job;
    }

    final void work() {
    
    

        // 吃早餐
        eat();

        // 早会
        String workContent = earlyMeeting();

        // 根据早会内容制定工作计划
        boolean flag = workPlan(workContent);

        // 没有工作那就摸鱼喽
        if(true == flag){
    
    
            fish();
        }
    }

    /**
     * 吃早餐
     */
    abstract void eat();

    /**
     * 早会
     *
     * @return 工作内容
     */
    abstract String earlyMeeting();

    /**
     * 工作计划
     *
     * @param workContent 工作内容
     * @return 是否摸鱼
     */
    abstract boolean workPlan(String workContent);

    /**
     * 摸鱼
     */
    abstract void fish();
}

2. Un día en la vida de un director de proyecto

package com.guor.template;

/**
 * 项目经理
 */
public class ProjectManager extends WorkDay{
    
    

    public ProjectManager(String name, String job) {
    
    
        super(name, job);
    }

    @Override
    void eat() {
    
    
        System.out.println(name + "哪有时间吃饭");
    }

    @Override
    String earlyMeeting() {
    
    
        System.out.println(name + "的早会内容 --> " + job);
        // 写周报、工作总结、项目计划书、投标文档...
        return job;
    }

    @Override
    boolean workPlan(String workContent) {
    
    
        System.out.println(name + "工作计划:一些细思极恐的工作细节");
        return true;
    }

    @Override
    void fish() {
    
    
        System.out.println(name + "摸鱼时光:哪有时间摸鱼,操");
    }
}

3. Un día en la vida de un programador

package com.guor.template;

public class Programmer extends WorkDay {
    
    

    public Programmer(String name, String job) {
    
    
        super(name, job);
    }

    @Override
    void eat() {
    
    
        System.out.println(name + " --> 吃包子喝豆浆");
    }

    @Override
    String earlyMeeting() {
    
    
        System.out.println(name + "的早会内容 --> " + job);
        return job;
    }

    @Override
    boolean workPlan(String workContent) {
    
    
        if(job.equals(workContent)){
    
    
            System.out.println(name+"的工作计划 --> "+job);
            return true;
        }
        return false;
    }

    @Override
    void fish() {
    
    
        System.out.println(name + "的摸鱼时光:看哪吒博客");
    }
}

4. Día de la novia

package com.guor.template;

/**
 * 女朋友
 */
public class GirlFriends extends WorkDay{
    
    

    public GirlFriends(String name, String job) {
    
    
        super(name, job);
    }

    @Override
    void eat() {
    
    
        System.out.println(name + " -- 豆浆,糖酥藕片,丸子,干果仁,烤麻花,水果");
    }

    @Override
    String earlyMeeting() {
    
    
        // 只负责美,哪用开会
        System.out.println(name + "的早会内容 --> " + job);
        return "";
    }

    /**
     * 女朋友只负责美,没有工作
     */
    @Override
    boolean workPlan(String workContent) {
    
    
        System.out.println(name + "只负责美,没有工作");
        return true;
    }

    @Override
    void fish() {
    
    
        System.out.println(name + "每天除了摸鱼,还能干什么");
    }
}

5. Clase de prueba

public static void main(String[] args) {
    
    
    GirlFriends girlFriends = new GirlFriends("云韵","只负责美,没有工作");
    girlFriends.work();

    System.out.println("***********************");

    Programmer programmer = new Programmer("程序员","增删改查");
    programmer.work();

    System.out.println("***********************");

    ProjectManager projectManager = new ProjectManager("项目经理","写周报、工作总结、项目计划书、投标文档...");
    projectManager.work();
}

6. Pantalla de la consola

inserte la descripción de la imagen aquí

6. Resumen

A través del código anterior, puede ver claramente que el núcleo del patrón del método de plantilla es

  1. Defina una clase abstracta, defina un método de esqueleto de proceso final y defina varios métodos abstractos;
  2. Defina una subclase para heredar esta clase abstracta y reescriba sus métodos abstractos de acuerdo con la lógica comercial real;

Las subclases no necesitan preocuparse por la lógica de ejecución específica, todas se ejecutan de acuerdo con un proceso unificado. El heredero de la clase solo necesita preocuparse por la lógica comercial específica.

很多人觉得设计模式很简单,但是,能够熟练的将设计模式应用在自己的项目中,将各模块、功能规划的井井有条,运用的炉火纯青、恰到好处,真的很难。反复阅读,仔细体会。

Serie de artículos de patrones de diseño:

patrón de diseño java 1, principio de responsabilidad única

patrón de diseño java 2, principio abierto-cerrado

Patrón de diseño de Java 3, principio de sustitución de Liskov

patrón de diseño java 4, no hables con extraños

patrón de diseño java 5, principio de aislamiento de interfaz

Patrón de diseño de Java 6, principio de inversión de dependencia

patrón de diseño java 7, patrón de método de fábrica

Patrón de diseño Java 8, control, artefacto de mejora del proceso de aprobación, patrón de cadena de responsabilidad

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/guorui_java/article/details/126374557
Recomendado
Clasificación