Department充当抽象访问者角色,FAdepartment 表示财务部,HRdepartment表示人力资源部,他们充当具体访问者角色。Employee表示抽象元素角色,Employlist充当对象结构,用于表示员工列表,FullTime表示正杀员工,paryTime表示临时员工。

package visitor;

public interface employee {
public void accept(Department handler);

}
 class fulltime implements employee{

    private String name;
    private double weeklyWage;
    private int workTime;

     public fulltime(String name, double weeklyWage, int workTime) {
         this.name = name;
         this.weeklyWage = weeklyWage;
         this.workTime = workTime;
     }

     public String getName() {
         return name;
     }

     public void setName(String name) {
         this.name = name;
     }

     public double getWeeklyWage() {
         return weeklyWage;
     }

     public void setWeeklyWage(double weeklyWage) {
         this.weeklyWage = weeklyWage;
     }

     public int getWorkTime() {
         return workTime;
     }

     public void setWorkTime(int workTime) {
         this.workTime = workTime;
     }

     public void accept(Department handler) {
        handler.visit(this);
     }
 }

 class parttime implements employee{

    private String name;
    private double hourWage;
    private int age;

     public parttime(String name, double hourWage, int age) {
         this.name = name;
         this.hourWage = hourWage;
         this.age = age;
     }

     public String getName() {
         return name;
     }

     public void setName(String name) {
         this.name = name;
     }

     public double getHourWage() {
         return hourWage;
     }

     public void setHourWage(double hourWage) {
         this.hourWage = hourWage;
     }

     public int getAge() {
         return age;
     }

     public void setAge(int age) {
         this.age = age;
     }

     public void accept(Department handler) {
        handler.visit(this);
     }
 }
package visitor;

public class Department {
    public void visit(fulltime f) {
    }
    public void visit(parttime p) {
    }
}

class Fadepartment extends Department{
    public void visit(fulltime em){
        int workTime =em.getWorkTime();
        double weekWage =em.getWeeklyWage();
        if(workTime >40){
            weekWage =weekWage+(workTime-40)*100;

        }else if(workTime<40){
            weekWage =weekWage-(40-workTime)*80;
            if(weekWage<0){
                weekWage=0;
            }
        }
        System.out.println("正式员工"+em.getName()+"实际工资为"+em.getWeeklyWage());
    }

    public void visit(parttime e){
        int workTime= e.getAge();
        double hourWage =e.getHourWage();

        System.out.println("临时工"+e.getName()+"工资为"+workTime*hourWage);
    }
}

class Hrdepartment extends Department{
    @Override
    public void visit(fulltime f) {
        int workTime =f.getWorkTime();
        System.out.println("正式员工"+f.getName()+"实际工作时间为"+f.getWorkTime()+"");
        if(workTime >40){
            System.out.println("正式员工"+f.getName()+"加班时间"+(workTime-40));

        }else if(workTime<40){
            System.out.println("正式员工"+f.getName()+"请假时间"+(40-f.getWorkTime()));
        }
    }

    @Override
    public void visit(parttime p) {
        int workTime=p.getAge();
        System.out.println("临时工"+p.getName()+"实际工作时间"+p.getAge());
    }
}


package visitor;

import java.util.ArrayList;

public class EmployeeList {
    private ArrayList list= new ArrayList();
    public void addEmployee(employee e){
        list.add(e);
    }

    public void removeEmployee(employee e){
        list.remove(e);
    }
    public void  accept(Department d){
        for (Object o :list){
            ( (employee) o).accept(d);
        }
    }
}

package visitor;

public class client {
    public static void main(String[] args) {
        EmployeeList list =new EmployeeList();
        employee e1,e2,e3,e4;
        e1=new fulltime("小明",2030.0,45);
        e2=new fulltime("小芳",2582.0,55);
        e3=new fulltime("小文",1872.0,35);
        e4=new parttime("大明",21,1300);
        list.addEmployee(e1);
        list.addEmployee(e2);
        list.addEmployee(e3);
        list.addEmployee(e4);

        Department fa,hr;
        fa= new Fadepartment();
        hr= new Hrdepartment();
        System.out.println("财务部数据");
        list.accept(fa);

        System.out.println("人力资源部数据");
        list.accept(hr);

    }
}

运行结果: