The same data structure visitor pattern from different perspectives

Visitor mode is a complex design mode, which is not frequently used. Here is an example of a company's performance appraisal of employees. CEO and CTO have different appraisal standards for employees

Employee abstract class

public abstract class Staff {
    public String name;
    public int kpi;
    public Staff(String name) {
        this.name = name;
        kpi = new Random().nextInt(10);
    }

    public abstract void accept(Visitor visitor);
}

In the base class, there are only public properties of employees. Here are name and kpi

Employee specific

  1. Engineers
public class Engineer extends Staff {
    public Engineer(String name) {
        super(name);
    }

    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }

    public int getCodeLines() {
        return new Random().nextInt(10*10000);
    }
}
  1. Product Manager
public class Manager extends Staff {
    public Manager(String name) {
        super(name);
    }

    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }

    public int getProducts() {
        return new Random().nextInt(10);
    }
}

Add unique properties to specific classes so that visitors can be treated differently when they visit

Abstract visitor class

public interface Visitor {
    void visit(Engineer engineer);
    void visit(Manager manager);
}

Specific access class

  1. CEO: only care about employee's name and KPI
public class CEO implements Visitor {
    @Override
    public void visit(Engineer engineer) {
        System.out.println("Engineer: "+ engineer.name + ", kpi: " +engineer.kpi);
    }

    @Override
    public void visit(Manager manager) {
        System.out.println("Manager: "+ manager.name + ", kpi: "+manager.kpi);
    }
}
  1. CTO: care about different technical indicators according to different positions
public class CTO implements Visitor {
    @Override
    public void visit(Engineer engineer) {
        System.out.println("Engineer: " + engineer.name +", code: " + engineer.getCodeLines());
    }

    @Override
    public void visit(Manager manager) {
        System.out.println("Manager: " + manager.name + ", product: "+ manager.getProducts());
    }
}

Specific examples are as follows

public class Main {
    public static void main(String[] args) {
        BusinessReport businessReport = new BusinessReport();
        System.out.println("======CEO=====");
        businessReport.showReport(new CEO());
        System.out.println("\n=====CTO=====");
        businessReport.showReport(new CTO());
    }
}

Result

Visitor pattern can easily add visitors and view the same data structure from multiple perspectives

Posted by TurtleDove on Thu, 30 Apr 2020 14:22:19 -0700