[Patrón de diseño] 23, Patrón de visitante

(23) Modo Visitante

El patrón de visitante es un patrón de diseño que separa las estructuras de datos de la manipulación de datos.

1. Los principios de diseño del patrón de visitante

1. Visitante abstracto (IVisitor): una interfaz o clase abstracta que define un método visit();

2. ConcreateVisitor: Operación de elementos específicos;

3. Elemento abstracto (IElement): define un método accept() que recibe acceso de visitantes;

4. ConcreateElement: Recibir la implementación específica del visitante;

5. ObjectStructure: internamente mantiene una colección de elementos y acepta el acceso a todos los elementos.

2. Caso sencillo

Tome la evaluación de desempeño de ingenieros y gerentes por CTO y CEO respectivamente. El CTO se preocupa por la calidad del código del ingeniero y la cantidad de productos nuevos del gerente, el CEO se preocupa por el KPI del ingeniero, el KPI del gerente y la cantidad de productos nuevos del gerente.

public abstract class Employee {
    
    
    public String name;
    public int kpi;

    public Employee(String name){
    
    
        this.name = name;
        kpi = new Random().nextInt(10);
    }

    /**
     * 接受访问者访问
     * @param visitor 访问者接口
     */
    public abstract void accept(IVisitor visitor);
}
public class Engineer extends Employee {
    
    

    public Engineer(String name) {
    
    
        super(name);
    }

    @Override
    public void accept(IVisitor visitor) {
    
    
        visitor.visit(this);
    }
    public int getCodeLine(){
    
    
        return new Random().nextInt(10*1000);
    }
}
public class Manager extends Employee {
    
    
    public Manager(String name) {
    
    
        super(name);
    }

    @Override
    public void accept(IVisitor visitor) {
    
    
        visitor.visit(this);
    }
    public int getProducts(){
    
    
        return new Random().nextInt(10);
    }
}
public interface IVisitor {
    
    
    /**
     * 访问工程师
     * @param engineer
     */
    void visit(Engineer engineer);

    /**
     * 访问经理
     * @param manager
     */
    void visit(Manager manager);
}
public class CEOVisitor implements IVisitor {
    
    
    @Override
    public void visit(Engineer engineer) {
    
    
        System.out.println(engineer.name+" kpi为"+engineer.kpi);
    }

    @Override
    public void visit(Manager manager) {
    
    
        System.out.println(manager.name+" kpi为"+manager.kpi+" 产品数为"+manager.getProducts());
    }
}
public class CTOVisitor implements IVisitor {
    
    
    @Override
    public void visit(Engineer engineer) {
    
    
        System.out.println(engineer.name+" 代码量为"+engineer.getCodeLine());
    }

    @Override
    public void visit(Manager manager) {
    
    
        System.out.println(manager.name+" 产品数为"+manager.getProducts());
    }
}
public class BusinessReport {
    
    
    private List<Employee> employees = new LinkedList<Employee>();

    public BusinessReport(){
    
    
        employees.add(new Manager("A经理"));
        employees.add(new Manager("B经理"));
        employees.add(new Engineer("C工程师"));
        employees.add(new Engineer("D工程师"));
    }

    /**
     * 报表展示
     * @param visitor
     */
    public void showReport(IVisitor visitor){
    
    
        for(Employee employee : employees){
    
    
           employee.accept(visitor);
        }
    }
}
public class Client {
    
    
    public static void main(String[] args) {
    
    
        BusinessReport businessReport = new BusinessReport();
        System.out.println("CEO查看报表:");
        businessReport.showReport(new CEOVisitor());
        System.out.println("CTO查看报表");
        businessReport.showReport(new CTOVisitor());
    }
}

imagen-20210330191753656

3. Comentarios simples sobre el modo visitante

La clase correspondiente a un objeto en la estructura del objeto rara vez cambia, pero a menudo es necesario definir nuevas operaciones en esta estructura del objeto. 2. Es necesario realizar muchas operaciones diferentes y no relacionadas en objetos en una estructura de objeto, y es necesario evitar que estas operaciones "contaminen" las clases de estos objetos, y no desea modificar estas clases cuando se agregan nuevas operaciones.

Supongo que te gusta

Origin blog.csdn.net/qq_40589204/article/details/119914835
Recomendado
Clasificación