- 定义:封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。
- 业务类A为类B、C的公共属性的方法,B、C均继承A,但又有各自的属性和方法
- 业务类A中包含一个公共方法accept(Visitor),其参数为一个观察者对象,B、C具体实现visitor.visit(this);
- 访问者类D会针对B、C各自实例一个具体方法,参数分别为B、C
- 代码:
public abstract class Employee {
public final static int MALE = 0; //0代表是男性
public final static int FEMALE = 1; //1代表是女性
private String name;//甭管是谁,都有工资 get set
private int salary;//只要是员工那就有薪水 get set
private int sex;//性别很重要 get set
public abstract void accept(VisitorInterface visitor);//允许一个访问者访问
}
public class CommonEmployee extends Employee{
private String job;//get set
public void accept(VisitorInterface visitor) {
visitor.visit(this);
}
}
public class Manager extends Employee{
private String performance;//get set
public void accept(VisitorInterface visitor) {
visitor.visit(this);
}
}
public interface VisitorInterface {
public void visit(CommonEmployee commonEmployee);//首先定义可访问普通员工
public void visit(Manager manager);//其次定义,我还可以访问部门经理
}
public class Visitor implements VisitorInterface{
public void visit(CommonEmployee commonEmployee) {
String commonEmployeeInfo = getCommonEmployee(commonEmployee);
System.out.println(commonEmployeeInfo);
}
public void visit(Manager manager) {
String managerInfo = getManagerInfo(manager);
System.out.println(managerInfo);
}
//组装出基本信息
private String getBasicInfo(Employee employee){
String info = "姓名:" + employee.getName() + "\t";
info = info + "性别:" + (employee.getSex() == Employee.FEMALE?"女":"男") + "\t";
info = info + "薪水:" + employee.getSalary() + "\t";
return info;
}
private String getCommonEmployee(CommonEmployee commonEmployee){
String basicInfo = this.getBasicInfo(commonEmployee);
String otherInfo = "工作:"+commonEmployee.getJob()+"\t";
return basicInfo + otherInfo;
}
private String getManagerInfo(Manager manager){
String basicInfo = this.getBasicInfo(manager);
String otherInfo = "业绩:"+manager.getPerformance() + "\t";
return basicInfo + otherInfo;
}
}
public class Client {
public static void main(String[] args){
for(Employee emp:mockEmployee()){
emp.accept(new Visitor());
}
}
//模拟出公司的人员情况,我们可以想象这个数据室通过持久层传递过来的
public static List<Employee> mockEmployee(){
List<Employee> empList = new ArrayList<Employee>();
//产生张三这个员工
CommonEmployee zhangSan = new CommonEmployee();
zhangSan.setJob("编写Java程序,绝对的蓝领、苦工加搬运工");
zhangSan.setName("张三");
zhangSan.setSalary(1800);
zhangSan.setSex(Employee.MALE);
empList.add(zhangSan);
//产生李四这个员工
CommonEmployee liSi = new CommonEmployee();
liSi.setJob("页面美工,审美素质太不流行了!");
liSi.setName("李四");
liSi.setSalary(1900);
liSi.setSex(Employee.FEMALE);
empList.add(liSi);
//再产生一个经理
Manager wangWu = new Manager();
wangWu.setName("王五");
wangWu.setPerformance("基本上是负值,但是我会拍马屁呀");
wangWu.setSalary(18750);
wangWu.setSex(Employee.MALE);
empList.add(wangWu);
return empList;
}
}