Mega Code Archive

 
Categories / Java / Design Pattern
 

Visitor pattern in 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(); }