Mega Code Archive

 
Categories / Java / Design Pattern
 

Prototype pattern in Java

/* The Design Patterns Java Companion Copyright (C) 1998, by James W. Cooper IBM Thomas J. Watson Research Center */ import java.awt.Button; import java.awt.Color; import java.awt.Frame; import java.awt.GridLayout; import java.awt.List; import java.awt.Panel; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.RandomAccessFile; import java.io.Serializable; import java.util.StringTokenizer; import java.util.Vector; public class SwimInfo extends Frame implements ActionListener {   SwimData sdata, sxdata = null;   List swList, cloneList;   Button Clone, Refresh, Quit;   Swimmer sw;   public SwimInfo() {     super("Prototype example");     sdata = new SwimData("swimmers.txt");     setGUI();     loadswList();   }   //-   public void actionPerformed(ActionEvent e) {     Object obj = e.getSource();     if (obj == Clone)       cloneAndLoad();     if (obj == Refresh)       loadswList();     if (obj == Quit)       System.exit(0);   }   //-   private void cloneAndLoad() {     //sxdata = (SwimData)sdata.deepClone();     sxdata = (SwimData) sdata.clone();     sxdata.sortByTime();     cloneList.removeAll();     //now print out sorted values from clone     for (int i = 0; i < sxdata.size(); i++) {       sw = sxdata.getSwimmer(i);       cloneList.addItem(sw.getName() + " " + sw.getTime());     }   }   //-   private void loadswList() {     swList.removeAll();     for (int i = 0; i < sdata.size(); i++) {       sw = sdata.getSwimmer(i);       swList.addItem(sw.getName() + " " + sw.getTime());     }   }   //-   private void setGUI() {     setLayout(new GridLayout(1, 3));     setBackground(Color.lightGray);     swList = new List(15);     cloneList = new List(15);     Panel cp = new Panel();     add(swList);     add(cp);     add(cloneList);     Clone = new Button("Clone >");     Refresh = new Button("<Refresh");     Quit = new Button("Quit");     cp.setLayout(new GridLayout(3, 1));     Panel p1 = new Panel();     cp.add(p1);     p1.add(Clone);     Panel p2 = new Panel();     cp.add(p2);     p2.add(Refresh);     Panel p3 = new Panel();     cp.add(p3);     p3.add(Quit);     Clone.addActionListener(this);     Refresh.addActionListener(this);     Quit.addActionListener(this);     setBounds(100, 100, 500, 400);     setVisible(true);   }   //-   static public void main(String argv[]) {     new SwimInfo();   } } class SwimmerNoSex extends SwimData {   public SwimmerNoSex(String fileName) {       super(fileName);   }   public void sortByTime() {   } } class SwimData implements Cloneable, Serializable {   protected Vector swimmers;   public SwimData(String filename) {     String s = "";     swimmers = new Vector();     InputFile f = new InputFile(filename);     s = f.readLine();     while (s != null) {       swimmers.addElement(new Swimmer(s));       s = f.readLine();     }     f.close();   }      public int size() {     return swimmers.size();   }      public Swimmer getSwimmer(int i) {     if ((i >= 0) && (i < swimmers.size()))       return (Swimmer) swimmers.elementAt(i);     else       return null;   }      public void sortByTime() {     Swimmer sw;     int i, j;     int max = swimmers.size();     Swimmer sd[] = new Swimmer[max];     for (i = 0; i < max; i++)       sd[i] = (Swimmer) swimmers.elementAt(i);     for (i = 0; i < max; i++) {       for (j = i; j < max; j++) {         if (sd[i].getTime() > sd[j].getTime()) {           sw = sd[i];           sd[i] = sd[j];           sd[j] = sw;         }       }     }     // swimmers = new Vector();     swimmers.removeAllElements();     for (i = 0; i < max; i++)       swimmers.addElement(sd[i]);   }      public Object deepClone() {     try {       ByteArrayOutputStream b = new ByteArrayOutputStream();       ObjectOutputStream out = new ObjectOutputStream(b);       out.writeObject(this);       ByteArrayInputStream bIn = new ByteArrayInputStream(b.toByteArray());       ObjectInputStream oi = new ObjectInputStream(bIn);       return (oi.readObject());     } catch (Exception e) {       System.out.println("exception:" + e.getMessage());       e.printStackTrace();       return null;     }   }      public Object clone() {     try {       return super.clone();     } catch (Exception e) {       System.out.println(e.getMessage());       return null;     }   } } //============================================== class Swimmer implements Serializable {   String name;   int age;   String club;   float time;   boolean female;   public Swimmer(String dataline) {     StringTokenizer st = new StringTokenizer(dataline, ",");     name = st.nextToken();     age = new Integer(st.nextToken().trim()).intValue();     club = st.nextToken().trim();     time = new Float(st.nextToken().trim()).floatValue();     //System.out.println(name+" "+time);     String sx = st.nextToken().trim().toUpperCase();     female = sx.equals("F");   }   public boolean isFemale() {     return female;   }   public int getAge() {     return age;   }   public float getTime() {     return time;   }   public String getName() {     return name;   }   public String getClub() {     return club;   } } class InputFile {   RandomAccessFile f = null;   boolean errflag;   String s = null;   public InputFile(String fname) {     errflag = false;     try {       //open file       f = new RandomAccessFile(fname, "r");     } catch (IOException e) {       //print error if not found       System.out.println("no file found");       errflag = true; //and set flag     }   }      public boolean checkErr() {     return errflag;   }      public String read() {     //read a single field up to a comma or end of line     String ret = "";     if (s == null) //if no data in string     {       s = readLine(); //read next line     }     if (s != null) //if there is data     {       s.trim(); //trim off blanks       int i = s.indexOf(","); //find next comma       if (i <= 0) {         ret = s.trim(); //if no commas go to end of line         s = null; //and null out stored string       } else {         ret = s.substring(0, i).trim(); //return left of comma         s = s.substring(i + 1); //save right of comma       }     } else       ret = null;     return ret; //return string   }      public String readLine() {     //read in a line from the file     s = null;     try {       s = f.readLine(); //could throw error     } catch (IOException e) {       errflag = true;       System.out.println("File read error");     }     return s;   }      public void close() {     try {       f.close(); //close file     } catch (IOException e) {       System.out.println("File close error");       errflag = true;     }   }    } //Swimmers.txt /* Kristen Frost, 9, CAT, 26.31, F Kimberly Watcke, 10, CDEV,27.37, F Jaclyn Carey, 10, ARAC, 27.53, F Megan Crapster, 10, LEHY, 27.68, F Kaitlyn Ament, 10, HNHS, 28.20, F Jackie Rogers, 10, WCA, 28.68, F Erin McLaughlin, 9, HMST, 28.80, F Emily Ferrier, 10, NMIL, 28.85, F Aurora Lee, 8, FFLY, 28.88, F Kate Isselee, 9, NMIL, 28.91, F Luke Mester, 10, GYWD, 24.88,  M Stephen Cosme, 9, OAK, 27.89, M Jeffrey Sudbury, 10, WYW, 28.24, M Ernest Verrico, 9, SHKS, 28.46, M David Liebovitz, 10, WYW, 28.78, M Ryan Rynazewski, 10, AJSC, 28.83, M Matthew Donch, 9, PSDY, 28.95, M Christopher Prus, 10, RAYS, 29.02, M Charles Baker, 10, PSDY, 29.06, M Matthew Sweitzer, 10, SHKS, 29.10, M */