访问者模式学习笔记
什么是访问者模式?
访问者模式(Visitor Pattern)是一种行为型设计模式,它允许你将算法与对象结构分离开来,使得算法可以独立地操作对象结构。
在访问者模式中,我们定义了一个访问者(Visitor)和多个元素(Element),每个元素都接受访问者的访问。访问者可以对不同类型的元素执行不同的操作,从而实现对对象结构的操作。
实例
假设我们有一个人资源管理系统,其中包含了多个员工类,如下所示:
javaCopy Codepublic abstract class Employee {
protected String name;
protected int salary;
public Employee(String name, int salary) {
this.name = name;
this.salary = salary;
}
public abstract void accept(Visitor visitor);
// getters and setters...
}
public class Engineer extends Employee {
public Engineer(String name, int salary) {
super(name, salary);
}
@Override
public void accept(Visitor visitor) {
visitor.visitEngineer(this);
}
}
public class Manager extends Employee {
public Manager(String name, int salary) {
super(name, salary);
}
@Override
public void accept(Visitor visitor) {
visitor.visitManager(this);
}
}
我们还定义了一个访问者类:
javaCopy Codepublic interface Visitor {
void visitEngineer(Engineer engineer);
void visitManager(Manager manager);
}
public class SalaryVisitor implements Visitor {
private int totalSalary;
public void visitEngineer(Engineer engineer) {
totalSalary += engineer.getSalary();
}
public void visitManager(Manager manager) {
totalSalary += manager.getSalary();
}
public int getTotalSalary() {
return totalSalary;
}
}
现在,我们可以使用访问者模式来计算公司的总薪水:
javaCopy Codepublic class App {
public static void main(String[] args) {
List<Employee> employees = new ArrayList<>();
employees.add(new Engineer("Alice", 10000));
employees.add(new Manager("Bob", 20000));
employees.add(new Engineer("Charlie", 15000));
SalaryVisitor salaryVisitor = new SalaryVisitor();
for (Employee employee : employees) {
employee.accept(salaryVisitor);
}
System.out.println("Total salary: " + salaryVisitor.getTotalSalary());
}
}
输出结果为:
Copy CodeTotal salary: 45000
在这个例子中,我们定义了两个元素类(Engineer 和 Manager)和一个访问者类(SalaryVisitor)。当我们需要访问所有员工,并计算他们的薪水时,我们可以使用 SalaryVisitor 访问者类。遍历所有的员工,并调用 accept 方法,这样就能够让 SalaryVisitor 访问每个员工,并执行相应的操作。
总结
访问者模式通过将算法与对象结构分离开来,使得算法可以独立地操作对象结构。这种设计模式可以使得程序更加灵活,易于扩展和维护。