场景:将公司中所有人员信息都打印汇报出来,其中假设公司有两类人员:
1.普通员工
2.管理层
不同人员类型的信息是不同的。
访问者模式:
定义:封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。
包含如下几个角色:
1.Visitor-抽象访问者
抽象类或者接口,声明访问者可以访问哪些元素,具体到程序中就是visit方法的参数定义哪些对象是可以被访问,利用了多态的性质
2.ConcreteVisitor-具体访问者
它影响访问者访问到一个类后该怎么干,要做什么事。
3.Element-抽象元素
接口或者抽象类,声明接受哪一类访问者访问,程序上市通过accept方法中的参数来定义的
4.ConcreteElement-具体元素
实现accept方法,通常是Visitor.visit(this)。
5.ObjectStruture-结构对象
元素产生者,一般在多个不同类中。
场景问题解决类图:
主要涉及如下几个角色:
1.抽象员工
2.普通员工
3.管理阶层
4.访问者接口
5.访问者实现
6.场景类
代码实现:
Employee:
public abstract class Employee {
public final static int MALE = 0;
public final static int FEMALE = 1;
private String name;
private int salary;
private String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
public String getSex() {
return sex;
}
public void setSex(String string) {
this.sex = string;
}
public abstract void accept(IVisitor visitor);
}
CommonEmployee:
private String job;
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public void accept(IVisitor visitor) {
visitor.visit(this);
}
}
Manager:
public class Manager extends Employee {
private String performance;
public String getPerformance() {
return performance;
}
public void setPerformance(String performance) {
this.performance = performance;
}
public void accept(IVisitor visitor) {
visitor.visit(this);
}
}
IVisitor:
public interface IVisitor {
public void visit(CommonEmployee commonEmployee);
public void visit(Manager manager);
}
Visitor:
public class Visitor implements IVisitor {
public void visit(CommonEmployee commonEmployee) {
System.out.println(this.getCommonEmployeeInfo(commonEmployee));
}
public void visit(Manager manager) {
System.out.println(this.getManagerInfo(manager));
}
private String getBasicInfo(Employee employee) {
String info = "姓名" + employee.getName() + "\t";
info += "性别" + employee.getSex() + "\t";
info += "薪水" + employee.getSalary() + "\t";
return info;
}
private String getManagerInfo(Manager manager) {
String basicInfo = this.getBasicInfo(manager);
String otherInfo = "业绩" + manager.getPerformance() + "\t";
return basicInfo + otherInfo;
}
private String getCommonEmployeeInfo(CommonEmployee commonEmployee) {
String basicInfo = this.getBasicInfo(commonEmployee);
String otherInfo = "工作" + commonEmployee.getJob() + "\t";
return basicInfo + otherInfo;
}
}
Client:
public class Client {
public static void main(String[] agrs)throws Exception {
for (Employee employee : mockEmployee()) {
employee.accept(new Visitor());
}
}
public static List<Employee> mockEmployee() {
List<Employee> employeeList = new ArrayList<Employee>();
CommonEmployee zc = new CommonEmployee();
zc.setName("zc");
zc.setSex(Sex.MAN.sex(Employee.MALE));
zc.setSalary(14000);
zc.setJob("程序员");
employeeList.add(zc);
Manager manager = new Manager();
employeeList.add(manager);
return employeeList;
}
}