访问者模式是一种复杂的设计模式,使用频率不高,下面举一个公司对员工业绩考核的例子,CEO和CTO对员工的考核标准是不一样的
员工抽象类
1 | public abstract class Staff { |
基类中只有员工的公共属性,这里是姓名和kpi
员工具体类
工程师类
1
2
3
4
5
6
7
8
9
10
11
12
13
14public 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 | public class Manager extends Staff { |
在具体类中加入独特的属性,这样访问者访问时就可以区别对待
抽象访问者类
1 | public interface Visitor { |
具体访问类
CEO:只关心员工的姓名和KPI
1
2
3
4
5
6
7
8
9
10
11public 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:根据岗位的不同关心不同的技术指标
1 | public class CTO implements Visitor { |
具体示例如下
1 | public class Main { |
结果
访问者模式可以很方便地添加访问者,方便地从多种角度观察同一种数据结构