Modo de combinación del patrón de diseño de Java (9)

En esta vida, una persona debe ser una persona tranquila, una persona amable, una persona con una sonrisa en los labios y un corazón feliz. A veces, las personas que pueden soltar su temperamento y ceder ante tu mal genio no lo son porque te tengan miedo, sino porque saben cómo apreciarte más que a ti.

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/11

definición

El modo de combinación también se denomina modo de todo parcial , que combina objetos en una estructura de árbol para representar la estructura jerárquica "parte-todo".

Enciclopedia de Baidu

escenas que se utilizarán

  • Cuando necesita atravesar la organización, o cuando el objeto de procesamiento tiene una estructura de árbol, es adecuado utilizar el modo combinado
  • Se requiere una alta abstracción. Si hay una gran diferencia entre 'nodo' y 'hoja', no se recomienda utilizar el modo combinado

Errores comunes

¡El modo de combinación no es la combinación utilizada, sino la agregación utilizada!

Análisis de situación general

Asumiendo que hay una escuela, la escuela maneja a los maestros y los maestros manejan a los estudiantes ¿Cómo se atraviesa a todos los maestros y estudiantes?

En muchos casos, debería ser así:

UML类图(1.1):


La escuela gestiona al profesor, el profesor gestiona a los alumnos, haciendo tal relación de herencia múltiple

Desventajas de la herencia múltiple:

  • No es conveniente agregar o eliminar alumnos
  • El acoplamiento es demasiado alto,
  • El código original necesita ser modificado, lo que viola el principio de apertura y cierre (abierto para extensión, cerrado para modificación)

Análisis de modo de combinación

UML类图(1.2):Inserte la descripción de la imagen aquí

análisis:

  • La clase del estudiante hereda de la clase de la escuela y la clase de la escuela se agrega a la clase del estudiante
  • La clase del profesor hereda de la clase de la escuela y la clase de la escuela se suma a la clase del profesor.

Análisis de roles:

  • Componente: Esto sirve como una clase escolar (se usa para estandarizar el método de implementación)
  • Hoja: nodo hoja, aquí se refiere a la clase del estudiante, porque la clase del estudiante es la más baja y no tiene nodos secundarios.
  • Compuesto: nodos no hoja, puede haber varios nodos no hoja, aquí se refiere a la clase del profesor, debe haber nodos secundarios debajo de los nodos no hoja.

Por ejemplo:

  • Instructor (nodo no hoja)
  • Profesor de clase (nodo no hoja)
  • Profesor de clase (nodo no hoja)
  • Estudiante (nodo hoja)

Instructor> Profesor de clase> Profesor de clase> Estudiante

Al igual que un gran árbol, la parte inferior son las hojas.

ventaja:

  • Tiene una fuerte extensibilidad. Cuando necesitamos agregar nuevos objetos, no es necesario cambiar el código original y cumplir con el principio de apertura y cierre (abierto para extensión, cerrado para modificación)
  • Es conveniente crear una estructura jerárquica compleja y el cliente no necesita prestar atención a los detalles.

Código:

Escuela Clase de escuela:

Se usa para estandarizar el código

public abstract class School {
    
    
   
    //名字
    private String name;
    //年级
    private  String grade;

   	//添加
    public void add(School school){
    
    
    }
    //删除
    public void remove(School school){
    
    
    }
    //输出日志
	abstract void print();

    public School(String name, String grade) {
    
    
        this.name = name;
        this.grade = grade;
    }
    get...
    set...
}

¿Por qué el método add () remove () aquí no está escrito como abstracto?

Debido a que los nodos hoja no necesitan implementarse, evite los engaños.

Profesor:

public class Teacher extends School {
    
    

    List<School> mList = new ArrayList<>();

    public Teacher(String name, String grade) {
    
    
        super(name, grade);
    }

    @Override//输出日志
    void print() {
    
    
        Log.i("组合模式:", "========" + getName() + "========");
        for (int i = 0; i < mList.size(); i++) {
    
    
            mList.get(i).print();
        }
    }
    @Override
    public void add(School school) {
    
    
        mList.add(school);
    }
    @Override
    public void remove(School school) {
    
    
        mList.remove(school);
    }
}

Clase de estudiante:

public class Student extends School {
    
    

    public Student(String name, String grade) {
    
    
        super(name, grade);
    }

    @Override
    void print() {
    
    
        Log.i("组合模式", "========== " + getName() + getGrade() + " ==========");
    }
}

Código de prueba:

Log.i("组合模式,","=======  振华中学  ======");

Teacher t1 = new Teacher("语文老师","一年级");
Teacher t2 = new Teacher("数学老师","二年级");
Teacher t3 = new Teacher("英语老师","三年级");
Teacher t4 = new Teacher("体育老师","四年级");

t1.add(new Student("小王","一年级"));
t1.add(new Student("小张","一年级"));
t1.add(new Student("小李","一年级"));

t2.add(new Student("小王","二年级"));
t2.add(new Student("小张","二年级"));
t2.add(new Student("小李","二年级"));

t1.print();
t2.print();
t3.print();
t4.print();

Log图(2.1):
Inserte la descripción de la imagen aquí
¿Cómo agregar un nuevo nodo? Por ejemplo, el director de enseñanza gestiona al profesor de la clase:

Instructor de la clase de director de enseñanza:

public class Instructor extends School {
    
    
    private List<School> mlist = new ArrayList<>();

    public Instructor(String name, String grade) {
    
    
        super(name, grade);
    }

    @Override
    public void add(School school) {
    
    
        mlist.add(school);
    }

    @Override
    public void remove(School school) {
    
    
        mlist.remove(school);
    }

    @Override
    void print() {
    
    
        Log.i("组合模式", "----- " + getName() + getGrade() + "------");
        for (int i = 0; i < mlist.size(); i++) {
    
    
            mlist.get(i).print();
        }
    }
}

Código de prueba:

Log.i("组合模式,","=======  振华中学  ======");

Teacher t1 = new Teacher("语文老师","一年级");
Teacher t2 = new Teacher("数学老师","二年级");
Teacher t3 = new Teacher("英语老师","三年级");
Teacher t4 = new Teacher("体育老师","四年级");

t1.add(new Student("小王","一年级"));
t1.add(new Student("小张","一年级"));
t1.add(new Student("小李","一年级"));

t2.add(new Student("小王","二年级"));
t2.add(new Student("小张","二年级"));
t2.add(new Student("小李","二年级"));


Instructor instructor1 = new Instructor("王教导主任", "");
instructor1.add(t1);
instructor1.add(t2);

Instructor instructor2 = new Instructor("张教导主任", "");
instructor2.add(t3);
instructor2.add(t4);

instructor1.print();
instructor2.print();

Log图(2.2): Se Inserte la descripción de la imagen aquí
puede ver que la clase del director docente se agregó a tiempo, dejando que el director docente manejara al docente, y no manejó mucho código, y fue muy conveniente y rápido de escribir. Lo último es cumplir con el principio de apertura y cierre (abierto para ampliación, apagado para modificación)!

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í, por favor, me gusta apoyarlo ~

Supongo que te gusta

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