代码展示:
package com.example.test;
import java.util.ArrayList;
import java.util.List;
public class 访问者模式 {
}
abstract class Department{
abstract void visit(FullTimeEmployee fullTimeEmployee);//正式工的访问
abstract void visit(PartTimeEmployee PartTimeEmployee);//临时工的访问
}
class FADepartment extends Department{//财务部
@Override
void visit(FullTimeEmployee fullTimeEmployee) {
//财务部实现对正式工的访问
System.out.println("财务部对 正式工 " + fullTimeEmployee.name +"进行了访问,已根据工作情况计算了薪水");
}
@Override
void visit(PartTimeEmployee PartTimeEmployee) {
//财务部实现对小时工的访问
System.out.println("财务部对 小时工 " + PartTimeEmployee.name +"进行了访问,已根据工作情况计算了薪水");
}
}
class HRDepartment extends Department{//人力资源部
@Override
void visit(FullTimeEmployee fullTimeEmployee) {
//人力资源部实现对正式工的访问
System.out.println("人力资源部对 正式工 " + fullTimeEmployee.name +"进行了访问,已汇总考勤情况");
}
@Override
void visit(PartTimeEmployee PartTimeEmployee) {
//人力资源部实现对小时工的访问
System.out.println("人力资源部对 小时工 " + PartTimeEmployee.name +"进行了访问,已汇总考勤情况");
}
}
interface Employee{//职员
void accept(Department department);
}
class FullTimeEmployee implements Employee{//正式工
public String name;//姓名
public double weeklyWage;//周薪
public int workTime;//工时
public void accept(Department department) {
department.visit(this);
}
}
class PartTimeEmployee implements Employee{//临时工
public String name;//姓名
public double hourWage;//时薪
public int workTime;//工时
public void accept(Department department) {
department.visit(this);
}
}
class EmployeeList{
private static final List<Employee> LIST = new ArrayList<>();
public void accept(Department department){
LIST.forEach(employee -> employee.accept(department));
}
}
访问者模式总结:
1.主要关注双重分派的含义,其实就是两次调用,
第一次是调用了元素的accept方法
在元素的accept方法内进行了第二次调用,调用了访问者的visit方法
最终在访问者的visit方法中完成了对元素的访问
2.可以很方便的增加一个访问者,但是增加一个元素就很麻烦。因为抽象访问者要增加新元素的访问方法,所有具体访问者都要重写新的访问方法,改动量很大
所以对于访问者的改动是满足开闭原则的,但是针对元素就不满足开闭原则。此模式对于开闭原则具有倾斜性
优缺点总结:TODO
适用场景:TODO
标签:void,visit,分派,访问,设计模式,PartTimeEmployee,public,访问者 From: https://www.cnblogs.com/randy123/p/17893257.html