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
- 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);
}
}
- 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
- 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);
}
}
- 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