Patrones de diseño Notas de patrones para visitantes

ilustrar

Registre el método de escritura para aprender el patrón de diseño-Patrón de visitante. La versión de JDK utilizada es la versión 1.8.

Iterador (visitante)

Intención : Representa una operación que actúa sobre cada elemento en una estructura de objeto. Permite definir nuevas operaciones para cada elemento sin cambiar su clase.
Estructura :
Insertar descripción de la imagen aquí

en:

  • Visitor declara una operación Visita para cada clase de ConcreteElement en la estructura del objeto. El nombre y las características de la operación identifican la clase que envió la solicitud de visita al visitante, lo que le permite determinar la clase específica del elemento que está visitando. Esto permite a los visitantes acceder a él directamente a través de la interfaz específica del elemento.
  • ConcreteVisitor (visitante concreto) implementa cada operación declarada por Visitor, cada operación implementa parte del algoritmo y el fragmento del algoritmo es la clase correspondiente al objeto en la estructura. ConcreteVisitor proporciona contexto para el algoritmo y almacena su estado local. Este estado a menudo acumula resultados mientras atraviesa la estructura.
  • El elemento define una operación de aceptación que toma un intermediario como parámetro.
  • ConcreteElement (elemento concreto) implementa la operación Aceptar con un visitante como parámetro.
  • ObjcctStructure (estructura de objeto) puede enumerar sus elementos y puede proporcionar una interfaz de alto nivel para permitir al visitante acceder a sus elementos; puede ser una combinación o una colección, como una lista o un conjunto desordenado.

aplicabilidad:

  • Programas cuyas estructuras de objetos son relativamente estables, pero cuyos algoritmos operativos cambian con frecuencia.
  • Los objetos en la estructura del objeto deben proporcionar una variedad de operaciones diferentes y no relacionadas, y es necesario evitar que los cambios en estas operaciones afecten la estructura del objeto.

Tabla de contenido

Insertar descripción de la imagen aquí

Diagrama de clases de ejemplo de patrón de visitante

Insertar descripción de la imagen aquíInsertar descripción de la imagen aquí
Implemente el ejemplo del patrón de visitante con este diagrama de clases UML.

Clase de rol de visitante abstracto

package com.example.deesign_patterns.visitor;

//抽象访问者角色类
public interface Person {
    
    

    //喂食宠物猫
    void feed(Cat cat);

    //喂食宠物狗
    void feed(Dog dog);
}

Clase de rol de elemento abstracto

package com.example.deesign_patterns.visitor;

//抽象元素角色类
public interface Animal {
    
    

    //接受访问者访问的功能
    void accept(Person person);
}

gatos mascotas

package com.example.deesign_patterns.visitor;

//宠物猫类,具体元素角色类
public class Cat implements Animal{
    
    

    @Override
    public void accept(Person person) {
    
    
        person.feed(this);//访问者给宠物猫喂食
        System.out.println("好好吃,喵喵喵。。。");
    }
}

perros mascotas

package com.example.deesign_patterns.visitor;

//宠物狗类,具体元素角色类
public class Dog implements Animal{
    
    

    @Override
    public void accept(Person person) {
    
    
        person.feed(this);//访问者给宠物狗喂食
        System.out.println("好好吃,汪汪汪。。。");
    }
}

propia clase

package com.example.deesign_patterns.visitor;

//自己类,具体访问者角色类
public class Owner implements Person{
    
    

    @Override
    public void feed(Cat cat) {
    
    
        System.out.println("主人喂食猫");
    }

    @Override
    public void feed(Dog dog) {
    
    
        System.out.println("主人喂食狗");
    }
}

otros humanos

package com.example.deesign_patterns.visitor;

//其他人类,具体访问者角色类
public class Someone implements Person{
    
    

    @Override
    public void feed(Cat cat) {
    
    
        System.out.println("其他人喂食猫");
    }

    @Override
    public void feed(Dog dog) {
    
    
        System.out.println("其他人喂食狗");
    }
}

categoría familiar

package com.example.deesign_patterns.visitor;

import java.util.ArrayList;
import java.util.List;

//家类,对象结构类
public class Home {
    
    

    //声明一个集合对象,用来存储元素对象
    private List<Animal> nodeList=new ArrayList<Animal>();

    //添加元素功能
    public void add(Animal animal){
    
    
        nodeList.add(animal);
    }

    public void action(Person person){
    
    
        //遍历集合,获取每一个元素,让访问者访问每一个元素
        for(Animal animal:nodeList){
    
    
            animal.accept(person);
        }
    }
}

clase de prueba

package com.example.deesign_patterns.visitor;

//测试类
public class Client {
    
    

    public static void main(String[] args) {
    
    
        //创建Home对象
        Home home=new Home();
        //添加元素到Home对象中
        home.add(new Cat());
        home.add(new Dog());
        //创建主人对象
        Owner owner=new Owner();
        //让主人喂食所有宠物
        home.action(owner);
        //创建其他人对象
        Someone someone=new Someone();
        //让其他人喂食所有宠物
        home.action(someone);
    }
}

Insertar descripción de la imagen aquí

beneficio:

  • Buena escalabilidad. Agregue nueva funcionalidad a los elementos de la estructura del objeto sin modificar los elementos de la estructura del objeto.
  • Buena reutilización. Los visitantes se utilizan para definir funciones comunes a toda la estructura del objeto, mejorando así el grado de reutilización.
  • Separe los comportamientos irrelevantes. Utilice visitantes para separar comportamientos irrelevantes y encapsular comportamientos relacionados para formar un visitante, de modo que la función de cada visitante sea relativamente única.

defecto:

  • Los cambios en la estructura de los objetos son difíciles. En el patrón de visitante, cada vez que se agrega una nueva clase de elemento, se deben agregar las operaciones específicas correspondientes a cada clase de visitante específica, lo que viola el "principio de apertura y cierre".
  • Viola el principio de inversión de dependencia. El patrón de visitante se basa en clases concretas en lugar de clases abstractas.

Supongo que te gusta

Origin blog.csdn.net/weixin_48040732/article/details/131365578
Recomendado
Clasificación