Mega Code Archive

 
Categories / Java / Design Pattern
 

Strategy Pattern in Java

//[C] 2002 Sun Microsystems, Inc.--- 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.text.Collator; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; public class RunStrategyPattern {   public static void main(String[] arguments) {     System.out.println("Example for the Strategy pattern");     System.out.println();     System.out         .println("This code uses two Strategy classes, NameSummarizer and OrganizationSummarizer,");     System.out         .println(" to provide a sorted, summarized list for a ContactList. The ContactList object");     System.out         .println(" maintains a collection of Contacts, and delegates the task of representing");     System.out         .println(" its information to an associated object which implements SummarizingStrategy.");     System.out.println();     System.out         .println("Deserializing stored ContactList from the data.ser file");     System.out.println();     if (!(new File("data.ser").exists())) {       DataCreator.serialize("data.ser");     }     ContactList list = (ContactList) (DataRetriever         .deserializeData("data.ser"));     System.out.println("Creating NameSummarizer for the ContactList");     System.out         .println("(this Strategy displays only the last and first name,");     System.out         .println(" and sorts the list by last name, followed by the first)");     list.setSummarizer(new NameSummarizer());     System.out.println("Name Summarizer Output for the ContactList:");     System.out.println(list.summarize());     System.out.println();     System.out         .println("Creating OrganizationSummarizer for the ContactList");     System.out         .println("(this Strategy displays the organization, followed by the first");     System.out         .println(" and last name. It sorts by the organization, followed by last name)");     list.setSummarizer(new OrganizationSummarizer());     System.out         .println("Organization Summarizer Output for the ContactList:");     System.out.println(list.summarize());     System.out.println();   } } 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;   } } class ContactList implements Serializable {   private ArrayList contacts = new ArrayList();   private SummarizingStrategy summarizer;   public ArrayList getContacts() {     return contacts;   }   public Contact[] getContactsAsArray() {     return (Contact[]) (contacts.toArray(new Contact[1]));   }   public void setSummarizer(SummarizingStrategy newSummarizer) {     summarizer = newSummarizer;   }   public void setContacts(ArrayList newContacts) {     contacts = newContacts;   }   public void addContact(Contact element) {     if (!contacts.contains(element)) {       contacts.add(element);     }   }   public void removeContact(Contact element) {     contacts.remove(element);   }   public String summarize() {     return summarizer.summarize(getContactsAsArray());   }   public String[] makeSummarizedList() {     return summarizer.makeSummarizedList(getContactsAsArray());   } } class DataCreator {   private static final String DEFAULT_FILE = "data.ser";   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(makeContactList(), fileName);     } catch (IOException exc) {       exc.printStackTrace();     }   }   private static Serializable makeContactList() {     ContactList list = new ContactList();     list.addContact(new ContactImpl("David", "St. Hubbins", "Lead Guitar",         "The New Originals"));     list.addContact(new ContactImpl("Mick", "Shrimpton", "Drummer",         "The New Originals"));     list.addContact(new ContactImpl("Nigel", "Tufnel", "Lead Guitar",         "The New Originals"));     list.addContact(new ContactImpl("Derek", "Smalls", "Bass",         "The New Originals"));     list.addContact(new ContactImpl("Viv", "Savage", "Keyboards",         "The New Originals"));     list.addContact(new ContactImpl("Nick", "Shrimpton", "CEO",         "Fishy Business, LTD"));     list.addContact(new ContactImpl("Nickolai", "Lobachevski",         "Senior Packer", "Fishy Business, LTD"));     list.addContact(new ContactImpl("Alan", "Robertson", "Comptroller",         "Universal Exports"));     list.addContact(new ContactImpl("William", "Telle", "President",         "Universal Exports"));     list.addContact(new ContactImpl("Harvey", "Manfredjensenden",         "Inspector", "Universal Imports"));     list.addContact(new ContactImpl("Deirdre", "Pine", "Chief Mechanic",         "The Universal Joint"));     list.addContact(new ContactImpl("Martha", "Crump-Pinnett",         "Lead Developer", "Avatar Inc."));     list.addContact(new ContactImpl("Bryan", "Basham", "CTO", "IOVA"));     return list;   }   private static void serializeToFile(Serializable content, String fileName)       throws IOException {     ObjectOutputStream serOut = new ObjectOutputStream(         new FileOutputStream(fileName));     serOut.writeObject(content);     serOut.close();   } } class DataRetriever {   public static Object deserializeData(String fileName) {     Object returnValue = null;     try {       File inputFile = new File(fileName);       if (inputFile.exists() && inputFile.isFile()) {         ObjectInputStream readIn = new ObjectInputStream(             new FileInputStream(fileName));         returnValue = readIn.readObject();         readIn.close();       } else {         System.err.println("Unable to locate the file " + fileName);       }     } catch (ClassNotFoundException exc) {       exc.printStackTrace();     } catch (IOException exc) {       exc.printStackTrace();     }     return returnValue;   } } class NameSummarizer implements SummarizingStrategy {   private Comparator comparator = new NameComparator();   public String summarize(Contact[] contactList) {     StringBuffer product = new StringBuffer();     Arrays.sort(contactList, comparator);     for (int i = 0; i < contactList.length; i++) {       product.append(contactList[i].getLastName());       product.append(COMMA);       product.append(SPACE);       product.append(contactList[i].getFirstName());       product.append(EOL_STRING);     }     return product.toString();   }   public String[] makeSummarizedList(Contact[] contactList) {     Arrays.sort(contactList, comparator);     String[] product = new String[contactList.length];     for (int i = 0; i < contactList.length; i++) {       product[i] = contactList[i].getLastName() + COMMA + SPACE           + contactList[i].getFirstName() + EOL_STRING;     }     return product;   }   private class NameComparator implements Comparator {     private Collator textComparator = Collator.getInstance();     public int compare(Object o1, Object o2) {       Contact c1, c2;       if ((o1 instanceof Contact) && (o2 instanceof Contact)) {         c1 = (Contact) o1;         c2 = (Contact) o2;         int compareResult = textComparator.compare(c1.getLastName(), c2             .getLastName());         if (compareResult == 0) {           compareResult = textComparator.compare(c1.getFirstName(),               c2.getFirstName());         }         return compareResult;       } else         return textComparator.compare(o1, o2);     }     public boolean equals(Object o) {       return textComparator.equals(o);     }   } } class OrganizationSummarizer implements SummarizingStrategy {   private Comparator comparator = new OrganizationComparator();   public String summarize(Contact[] contactList) {     StringBuffer product = new StringBuffer();     Arrays.sort(contactList, comparator);     for (int i = 0; i < contactList.length; i++) {       product.append(contactList[i].getOrganization());       product.append(DELIMITER);       product.append(SPACE);       product.append(contactList[i].getFirstName());       product.append(SPACE);       product.append(contactList[i].getLastName());       product.append(EOL_STRING);     }     return product.toString();   }   public String[] makeSummarizedList(Contact[] contactList) {     Arrays.sort(contactList, comparator);     String[] product = new String[contactList.length];     for (int i = 0; i < contactList.length; i++) {       product[i] = contactList[i].getOrganization() + DELIMITER + SPACE           + contactList[i].getFirstName() + SPACE           + contactList[i].getLastName() + EOL_STRING;     }     return product;   }   private class OrganizationComparator implements Comparator {     private Collator textComparator = Collator.getInstance();     public int compare(Object o1, Object o2) {       Contact c1, c2;       if ((o1 instanceof Contact) && (o2 instanceof Contact)) {         c1 = (Contact) o1;         c2 = (Contact) o2;         int compareResult = textComparator.compare(             c1.getOrganization(), c2.getOrganization());         if (compareResult == 0) {           compareResult = textComparator.compare(c1.getLastName(), c2               .getLastName());         }         return compareResult;       } else         return textComparator.compare(o1, o2);     }     public boolean equals(Object o) {       return textComparator.equals(o);     }   } } interface SummarizingStrategy {   public static final String EOL_STRING = System       .getProperty("line.separator");   public static final String DELIMITER = ":";   public static final String COMMA = ",";   public static final String SPACE = " ";   public String summarize(Contact[] contactList);   public String[] makeSummarizedList(Contact[] contactList); }