El patrón de visitante del patrón de diseñador de Java (14)

El patrón de visitante del patrón de diseñador de Javava

La vida real es ocuparse de sus tareas diarias. No pidas amor y perspectivas que no tengan nada que ver contigo. No se detenga en emociones y juicios innecesarios. No se engañe, no se entregue a ello. No te lastimes ni seas hostil con los demás. No actúes y no creas en las actuaciones de otras personas.

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

definición

Representa una operación que actúa sobre cada elemento de una estructura de objeto. Te permite definir nuevas operaciones que actúan sobre estos elementos sin cambiar la clase de cada elemento.

Enciclopedia de Baidu

Escenario de aplicación

Suponiendo que se anunciarán los resultados del examen final:

Las calificaciones se dividen en: chino y matemáticas
Los estudiantes se dividen en: Xiao Ming, Xiao Hong

Si agrega una asignatura o agrega un alumno de la manera tradicional, debe cambiar el código original, que viola el principio de abierto y cerrado (abierto para extensión y cerrado para modificación), aquí está el modo de visitante

UML类图(1.1):

Inserte la descripción de la imagen aquí

  • Cuadro rojo: entrevistado (puntuación)

  • Cuadro amarillo: visitante (estudiante)

  • ObjectStructure agrega calificaciones y estudiantes. Al llamar, puede interactuar con ObjectStructure.

Análisis de roles

  • Achievement (): interfaz de entrevistado

  • Chino () / Matemáticas (): implementación de la interfaz del entrevistado

  • Estudiante (): interfaz de visitante

  • XiaoMing () / XiaoHong (): implementación de la interfaz de visitante

  • ObjectStructure (): rol de objeto de estructura, que es un rol necesario para usar el modelo de visitante. Tiene las siguientes características: puede enumerar sus elementos; puede proporcionar una interfaz de alto nivel para permitir que los visitantes accedan a sus elementos; si es necesario, puede diseñarse como un objeto compuesto o una colección (como una lista o una colección desordenada). ).

      我理解的ObjectStructure():避免访问者与被访问者直接交互,遵守迪米特原则
      (最少知道原则)
      
      迪米特原则定义之一:
      	一个类对自己依赖的类知道的越少越好,你的东西也别让我知道(不对外泄露信息)
    

Código

Interfaz de logros:

public interface Achievement {
    
    
    //分数
    void fraction();
}

Puntaje en idioma chino, realice la interfaz de puntaje:

public class Chinese implements Achievement {
    
    
    //姓名
    private final String name;
    //分数
    private final double fraction;
    //传递姓名和分数 
    public Chinese(String name ,double fraction) {
    
    
        this.fraction = fraction;
        this.name = name;
    }
    @Override
    public void fraction() {
    
    
        Log.i("访问者模式",name+" 的语文成绩为 "+fraction+" 分");
    }
}

Puntajes de matemáticas matemáticas, darse cuenta de la interfaz de puntaje:

public class Mathematics implements  Achievement {
    
    
    //姓名
    private final String name;
    //分数
    private final double fraction;

    public Mathematics(String name ,double fraction) {
    
    
        this.fraction = fraction;
        this.name = name;
    }
    @Override
    public void fraction() {
    
    
        Log.i("访问者模式",name+" 的数学成绩为 "+fraction+" 分");
    }
}

Interfaz de estudiante estudiante, agregue la interfaz de puntuación:

public interface Student {
    
    
    //具体学生
    void student(Achievement achievement);
}

XiaoMing Xiaoming, implemente la interfaz del estudiante:

public class XiaoMing implements Student {
    
    
    @Override
    public void student(Achievement achievement) {
    
    
        //小明成绩
        achievement.fraction();
    }
}

XiaoHong, date cuenta de la interfaz del estudiante:

public class XiaoHong implements Student {
    
    

    @Override
    public void student(Achievement achievement) {
    
    
        achievement.fraction();
    }
}

ObjectStructure, el papel de los objetos estructurados, (de acuerdo con el principio Dimit):

public class ObjectStructure {
    
    
    /**
     *  //输出成绩
     * @param student 具体学生
     * @param achievement 具体要除数的分数
     */
    public void outputAchievement(Student student,Achievement achievement){
    
    
            student.student(achievement);
    }
}

Código de prueba (cliente):

		 //小明
        XiaoMing xiaoMing = new XiaoMing();
        //小红
        XiaoHong xiaoHong = new XiaoHong();


        //小明语文成绩
        Chinese chinese1 = new Chinese("小明",67);

        //小红语文成绩
        Chinese chinese2 = new Chinese("小红",100);

        //小明数学成绩
        Mathematics mathematics = new Mathematics("小明",43);
		
		//结构对象角色
        ObjectStructure objectStructure = new ObjectStructure();

        xiaoMing.student(chinese1);
        objectStructure.outputAchievement(xiaoMing,chinese1);
        objectStructure.outputAchievement(xiaoHong,chinese2);
        objectStructure.outputAchievement(xiaoMing,mathematics);

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

Cómo expandirse

Por ejemplo, ahora necesitamos agregar un inglés, un compañero de clase llamado Xiao Zhang:

Puntaje en inglés en inglés, logra la interfaz de puntaje:

public class English implements Achievement{
    
    
    //姓名
    private final String name;
    //分数
    private final double fraction;

    public English(String name ,double fraction) {
    
    
        this.fraction = fraction;
        this.name = name;
    }
    @Override
    public void fraction() {
    
    
        Log.i("访问者模式",name+" 的英语成绩为 "+fraction+" 分");
    }
}

Estudiante de XiaoZhang, implemente la interfaz de estudiante:

public class XiaoZhang implements Student {
    
    

    @Override
    public void student(Achievement achievement) {
    
    
        achievement.fraction();
    }
}

Código de prueba (cliente):

 //小张
XiaoZhang xiaoZhang = new XiaoZhang();
//英语成绩
 English english = new English("小张", 55);
 
ObjectStructure objectStructure = new ObjectStructure();

objectStructure.outputAchievement(xiaoZhang,english);

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

  • Cumplir con el principio Dimit (solo comunicarse con amigos directos, cuanto menos sepa una clase sobre las clases de las que depende, mejor y no se filtra información). Esto se refiere a ObjectStructure
  • Cumplir con el principio de apertura y cierre (abierto para extensión, cerrado para modificación): aquí se refiere a la adición de extensión en inglés y Xiao Zhang , buena escalabilidad
  • Cumplir con el principio de responsabilidad única : (Una clase es responsable de una responsabilidad, ninguna clase es responsable de una responsabilidad), aquí se refiere a la clase de implementación correspondiente al grado / alumno

Código completo

Ir a la página de inicio del modo 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/112746412
Recomendado
Clasificación