Está en la página 1de 7

import import import import import import import import import import import

java.io.File; java.io.FileInputStream; java.io.FileOutputStream; java.io.IOException; java.io.ObjectInputStream; java.io.ObjectOutputStream; java.io.Serializable; java.text.Collator; java.util.ArrayList; java.util.Arrays; 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 Organi zationSummarizer,"); System.out .println(" to provide a sorted, summarized list for a ContactList. The C ontactList 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 Summ arizingStrategy."); 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 firs t"); 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); }

También podría gustarte