State Pattern in Java
//[C] 2002 Sun Microsystems, Inc.---
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
public class RunStatePattern {
public static void main(String[] arguments) {
System.out.println("Example for the State pattern");
System.out.println();
if (!(new File("appointments.ser").exists())) {
DataCreator.serialize("appointments.ser");
}
System.out.println("Creating CalendarEditor");
CalendarEditor appointmentBook = new CalendarEditor();
System.out.println("");
System.out.println("Created. Appointments:");
System.out.println(appointmentBook.getAppointments());
System.out.println("Created. Creating GUI:");
StateGui application = new StateGui(appointmentBook);
application.createGui();
System.out.println("");
}
}
interface State {
public void save();
public void edit();
}
interface Contact extends Serializable {
public static final String SPACE = " ";
public String getFirstName();
public String getLastName();
public String getTitle();
public String getOrganization();
public void setFirstName(String newFirstName);
public void setLastName(String newLastName);
public void setTitle(String newTitle);
public void setOrganization(String newOrganization);
}
class ContactImpl implements Contact {
private String firstName;
private String lastName;
private String title;
private String organization;
public ContactImpl() {
}
public ContactImpl(String newFirstName, String newLastName,
String newTitle, String newOrganization) {
firstName = newFirstName;
lastName = newLastName;
title = newTitle;
organization = newOrganization;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public String getTitle() {
return title;
}
public String getOrganization() {
return organization;
}
public void setFirstName(String newFirstName) {
firstName = newFirstName;
}
public void setLastName(String newLastName) {
lastName = newLastName;
}
public void setTitle(String newTitle) {
title = newTitle;
}
public void setOrganization(String newOrganization) {
organization = newOrganization;
}
public String toString() {
return firstName + SPACE + lastName;
}
}
interface Location extends Serializable {
public String getLocation();
public void setLocation(String newLocation);
}
class LocationImpl implements Location {
private String location;
public LocationImpl() {
}
public LocationImpl(String newLocation) {
location = newLocation;
}
public String getLocation() {
return location;
}
public void setLocation(String newLocation) {
location = newLocation;
}
public String toString() {
return location;
}
}
class FileLoader {
public static Object loadData(File inputFile) {
Object returnValue = null;
try {
if (inputFile.exists()) {
if (inputFile.isFile()) {
ObjectInputStream readIn = new ObjectInputStream(
new FileInputStream(inputFile));
returnValue = readIn.readObject();
readIn.close();
} else {
System.err.println(inputFile + " is a directory.");
}
} else {
System.err.println("File " + inputFile + " does not exist.");
}
} catch (ClassNotFoundException exc) {
exc.printStackTrace();
} catch (IOException exc) {
exc.printStackTrace();
}
return returnValue;
}
public static void storeData(File outputFile, Serializable data) {
try {
ObjectOutputStream writeOut = new ObjectOutputStream(
new FileOutputStream(outputFile));
writeOut.writeObject(data);
writeOut.close();
} catch (IOException exc) {
exc.printStackTrace();
}
}
}
class DataCreator {
private static final String DEFAULT_FILE = "data.ser";
private static Calendar dateCreator = Calendar.getInstance();
public static void main(String[] args) {
String fileName;
if (args.length == 1) {
fileName = args[0];
} else {
fileName = DEFAULT_FILE;
}
serialize(fileName);
}
public static void serialize(String fileName) {
try {
serializeToFile(createData(), fileName);
} catch (IOException exc) {
exc.printStackTrace();
}
}
private static Serializable createData() {
ArrayList appointments = new ArrayList();
ArrayList contacts = new ArrayList();
contacts.add(new ContactImpl("Test", "Subject", "Volunteer",
"United Patterns Consortium"));
Location location1 = new LocationImpl("Punxsutawney, PA");
appointments.add(new Appointment("Slowpokes anonymous", contacts,
location1, createDate(2001, 1, 1, 12, 01), createDate(2001, 1,
1, 12, 02)));
appointments.add(new Appointment("Java focus group", contacts,
location1, createDate(2001, 1, 1, 12, 30), createDate(2001, 1,
1, 14, 30)));
appointments
.add(new Appointment("Something else", contacts, location1,
createDate(2001, 1, 1, 12, 01), createDate(2001, 1, 1,
12, 02)));
appointments.add(new Appointment("Yet another thingie", contacts,
location1, createDate(2001, 1, 1, 12, 01), createDate(2001, 1,
1, 12, 02)));
return appointments;
}
private static void serializeToFile(Serializable content, String fileName)
throws IOException {
ObjectOutputStream serOut = new ObjectOutputStream(
new FileOutputStream(fileName));
serOut.writeObject(content);
serOut.close();
}
public static Date createDate(int year, int month, int day, int hour,
int minute) {
dateCreator.set(year, month, day, hour, minute);
return dateCreator.getTime();
}
}
class Appointment implements Serializable {
private String reason;
private ArrayList contacts;
private Location location;
private Date startDate;
private Date endDate;
public Appointment(String reason, ArrayList contacts, Location location,
Date startDate, Date endDate) {
this.reason = reason;
this.contacts = contacts;
this.location = location;
this.startDate = startDate;
this.endDate = endDate;
}
public String getReason() {
return reason;
}
public ArrayList getContacts() {
return contacts;
}
public Location getLocation() {
return location;
}
public Date getStartDate() {
return startDate;
}
public Date getEndDate() {
return endDate;
}
public void setReason(String reason) {
this.reason = reason;
}
public void setContacts(ArrayList contacts) {
this.contacts = contacts;
}
public void setLocation(Location location) {
this.location = location;
}
public void setStartDate(Date startDate) {
this.startDate = startDate;
}
public void setEndDate(Date endDate) {
this.endDate = endDate;
}
public String toString() {
return "Appointment:" + "\n Reason: " + reason + "\n Location: "
+ location + "\n Start: " + startDate + "\n End: "
+ endDate + "\n";
}
}
class CalendarEditor {
private State currentState;
private File appointmentFile;
private ArrayList appointments = new ArrayList();
private static final String DEFAULT_APPOINTMENT_FILE = "appointments.ser";
public CalendarEditor() {
this(DEFAULT_APPOINTMENT_FILE);
}
public CalendarEditor(String appointmentFileName) {
appointmentFile = new File(appointmentFileName);
try {
appointments = (ArrayList) FileLoader.loadData(appointmentFile);
} catch (ClassCastException exc) {
System.err
.println("Unable to load information. The file does not contain a list of appointments.");
}
currentState = new CleanState();
}
public void save() {
currentState.save();
}
public void edit() {
currentState.edit();
}
private class DirtyState implements State {
private State nextState;
public DirtyState(State nextState) {
this.nextState = nextState;
}
public void save() {
FileLoader.storeData(appointmentFile, appointments);
currentState = nextState;
}
public void edit() {
}
}
private class CleanState implements State {
private State nextState = new DirtyState(this);
public void save() {
}
public void edit() {
currentState = nextState;
}
}
public ArrayList getAppointments() {
return appointments;
}
public void addAppointment(Appointment appointment) {
if (!appointments.contains(appointment)) {
appointments.add(appointment);
}
}
public void removeAppointment(Appointment appointment) {
appointments.remove(appointment);
}
}
class StateGui implements ActionListener {
private JFrame mainFrame;
private JPanel controlPanel, editPanel;
private CalendarEditor editor;
private JButton save, exit;
public StateGui(CalendarEditor edit) {
editor = edit;
}
public void createGui() {
mainFrame = new JFrame("State Pattern Example");
Container content = mainFrame.getContentPane();
content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));
editPanel = new JPanel();
editPanel.setLayout(new BorderLayout());
JTable appointmentTable = new JTable(new StateTableModel(
(Appointment[]) editor.getAppointments().toArray(
new Appointment[1])));
editPanel.add(new JScrollPane(appointmentTable));
content.add(editPanel);
controlPanel = new JPanel();
save = new JButton("Save Appointments");
exit = new JButton("Exit");
controlPanel.add(save);
controlPanel.add(exit);
content.add(controlPanel);
save.addActionListener(this);
exit.addActionListener(this);
mainFrame.addWindowListener(new WindowCloseManager());
mainFrame.pack();
mainFrame.setVisible(true);
}
public void actionPerformed(ActionEvent evt) {
Object originator = evt.getSource();
if (originator == save) {
saveAppointments();
} else if (originator == exit) {
exitApplication();
}
}
private class WindowCloseManager extends WindowAdapter {
public void windowClosing(WindowEvent evt) {
exitApplication();
}
}
private void saveAppointments() {
editor.save();
}
private void exitApplication() {
System.exit(0);
}
private class StateTableModel extends AbstractTableModel {
private final String[] columnNames = { "Appointment", "Contacts",
"Location", "Start Date", "End Date" };
private Appointment[] data;
public StateTableModel(Appointment[] appointments) {
data = appointments;
}
public String getColumnName(int column) {
return columnNames[column];
}
public int getRowCount() {
return data.length;
}
public int getColumnCount() {
return columnNames.length;
}
public Object getValueAt(int row, int column) {
Object value = null;
switch (column) {
case 0:
value = data[row].getReason();
break;
case 1:
value = data[row].getContacts();
break;
case 2:
value = data[row].getLocation();
break;
case 3:
value = data[row].getStartDate();
break;
case 4:
value = data[row].getEndDate();
break;
}
return value;
}
public boolean isCellEditable(int row, int column) {
return ((column == 0) || (column == 2)) ? true : false;
}
public void setValueAt(Object value, int row, int column) {
switch (column) {
case 0:
data[row].setReason((String) value);
editor.edit();
break;
case 1:
break;
case 2:
data[row].setLocation(new LocationImpl((String) value));
editor.edit();
break;
case 3:
break;
case 4:
break;
}
}
}
}
Related examples in the same category