Design Pattern Java

/*
The Design Patterns Java Companion
Copyright (C) 1998, by James W. Cooper
IBM Thomas J. Watson Research Center
*/
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Vector;
import javax.swing.AbstractListModel;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
public class VacationDisplay extends JFrame implements ActionListener {
  JawtList empList;
  JTextField total, btotal;
  JButton Vac;
  Employee[] employees;
  public VacationDisplay() {
    super("Vacation Display");
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
        System.exit(0);
      }
    });
    JPanel jp = new JPanel();
    getContentPane().add(jp);
    jp.setLayout(new GridLayout(1, 2));
    empList = new JawtList(10);
    jp.add(empList);
    createEmployees();
    Box box = Box.createVerticalBox();
    jp.add(box);
    total = new JTextField(5);
    total.setHorizontalAlignment(JTextField.CENTER);
    box.add(total);
    box.add(Box.createVerticalStrut(10));
    btotal = new JTextField(5);
    btotal.setHorizontalAlignment(JTextField.CENTER);
    box.add(btotal);
    box.add(Box.createVerticalStrut(10));
    Vac = new JButton("Vacations");
    box.add(Vac);
    Vac.addActionListener(this);
    setSize(300, 200);
    setVisible(true);
    total.setText("  ");
    total.setBackground(Color.white);
  }
  public void createEmployees() {
    employees = new Employee[7];
    int i = 0;
    employees[i++] = new Employee("Susan Bear", 55000, 12, 1);
    employees[i++] = new Employee("Adam Gehr", 150000, 9, 0);
    employees[i++] = new Employee("Fred Harris", 50000, 15, 2);
    employees[i++] = new Employee("David Oakley", 57000, 12, 2);
    employees[i++] = new Employee("Larry Thomas", 100000, 20, 6);
    Boss b = new Boss("Leslie Susi", 175000, 16, 4);
    b.setBonusDays(12);
    Boss b1 = new Boss("Laurence Byerly", 35000, 17, 6);
    b1.setBonusDays(17);
    employees[i++] = b;
    employees[i++] = b1;
    for (i = 0; i < employees.length; i++) {
      empList.add(employees[i].getName());
    }
  }
  public void actionPerformed(ActionEvent e) {
    VacationVisitor vac = new VacationVisitor();
    bVacationVisitor bvac = new bVacationVisitor();
    for (int i = 0; i < employees.length; i++) {
      employees[i].accept(vac);
      employees[i].accept(bvac);
    }
    total.setText(new Integer(vac.getTotalDays()).toString());
    btotal.setText(new Integer(bvac.getTotalDays()).toString());
  }
  public static void main(String argv[]) {
    new VacationDisplay();
  }
}
class Employee {
  int sickDays, vacDays;
  float Salary;
  String Name;
  public Employee(String name, float salary, int vacdays, int sickdays) {
    vacDays = vacdays;
    sickDays = sickdays;
    Salary = salary;
    Name = name;
  }
  public String getName() {
    return Name;
  }
  public int getSickdays() {
    return sickDays;
  }
  public int getVacDays() {
    return vacDays;
  }
  public float getSalary() {
    return Salary;
  }
  public void accept(Visitor v) {
    v.visit(this);
  }
}
abstract class Visitor {
  public abstract void visit(Employee emp);
  public abstract void visit(Boss emp);
}
class Boss extends Employee {
  private int bonusDays;
  public Boss(String name, float salary, int vacdays, int sickdays) {
    super(name, salary, vacdays, sickdays);
  }
  public void setBonusDays(int bonus) {
    bonusDays = bonus;
  }
  public int getBonusDays() {
    return bonusDays;
  }
  public void accept(Visitor v) {
    v.visit(this);
  }
}
class VacationVisitor extends Visitor {
  protected int total_days;
  public VacationVisitor() {
    total_days = 0;
  }
  public void visit(Employee emp) {
    total_days += emp.getVacDays();
  }
  public void visit(Boss boss) {
    total_days += boss.getVacDays();
  }
  public int getTotalDays() {
    return total_days;
  }
}
class bVacationVisitor extends Visitor {
  int total_days;
  public bVacationVisitor() {
    total_days = 0;
  }
  public int getTotalDays() {
    return total_days;
  }
  public void visit(Boss boss) {
    total_days += boss.getVacDays();
    total_days += boss.getBonusDays();
  }
  public void visit(Employee emp) {
    total_days += emp.getVacDays();
  }
}
//this is a simple adapter class to
//convert List awt methods to Swing methods
class JawtList extends JScrollPane implements ListSelectionListener, awtList {
  private JList listWindow;
  private JListData listContents;
  public JawtList(int rows) {
    listContents = new JListData();
    listWindow = new JList(listContents);
    listWindow.setPrototypeCellValue("Abcdefg Hijkmnop");
    getViewport().add(listWindow);
  }
  public void add(String s) {
    listContents.addElement(s);
  }
  public void remove(String s) {
    listContents.removeElement(s);
  }
  public void clear() {
    listContents.clear();
  }
  public String[] getSelectedItems() {
    Object[] obj = listWindow.getSelectedValues();
    String[] s = new String[obj.length];
    for (int i = 0; i < obj.length; i++)
      s[i] = obj[i].toString();
    return s;
  }
  public void valueChanged(ListSelectionEvent e) {
  }
}
class JListData extends AbstractListModel {
  private Vector data;
  public JListData() {
    data = new Vector();
  }
  public int getSize() {
    return data.size();
  }
  public Object getElementAt(int index) {
    return data.elementAt(index);
  }
  public void addElement(String s) {
    data.addElement(s);
    fireIntervalAdded(this, data.size() - 1, data.size());
  }
  public void removeElement(String s) {
    data.removeElement(s);
    fireIntervalRemoved(this, 0, data.size());
  }
  public void clear() {
    int size = data.size();
    data = new Vector();
    fireIntervalRemoved(this, 0, size);
  }
}
interface awtList {
  public void add(String s);
  public void remove(String s);
  public String[] getSelectedItems();
}