访问者模式学习笔记

什么是访问者模式?

访问者模式(Visitor Pattern)是一种行为型设计模式,它允许你将算法与对象结构分离开来,使得算法可以独立地操作对象结构。

在访问者模式中,我们定义了一个访问者(Visitor)和多个元素(Element),每个元素都接受访问者的访问。访问者可以对不同类型的元素执行不同的操作,从而实现对对象结构的操作。

实例

假设我们有一个人资源管理系统,其中包含了多个员工类,如下所示:

javaCopy Code
public 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 Code
public 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 Code
public 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 Code
Total salary: 45000

在这个例子中,我们定义了两个元素类(Engineer 和 Manager)和一个访问者类(SalaryVisitor)。当我们需要访问所有员工,并计算他们的薪水时,我们可以使用 SalaryVisitor 访问者类。遍历所有的员工,并调用 accept 方法,这样就能够让 SalaryVisitor 访问每个员工,并执行相应的操作。

总结

访问者模式通过将算法与对象结构分离开来,使得算法可以独立地操作对象结构。这种设计模式可以使得程序更加灵活,易于扩展和维护。