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 */
1. | Prototype Pattern in Java 2 |