Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Applied Java™ Patterns - Stephen Stelting, Olav Maassen.pdf
Скачиваний:
208
Добавлен:
24.05.2014
Размер:
3 Мб
Скачать
☆

7. public String getOrganization();

8.

9.public void setFirstName(String newFirstName);

10.public void setLastName(String newLastName);

11.public void setTitle(String newTitle);

12.public void setOrganization(String newOrganization);

13.}

Example A.102 ContactImpl.java

1.public class ContactImpl implements Contact{

2.private String firstName;

3.private String lastName;

4.private String title;

5.private String organization;

6.

7.public ContactImpl(){}

8.public ContactImpl(String newFirstName, String newLastName,

9.String newTitle, String newOrganization){

10. firstName = newFirstName;

11. lastName = newLastName;

12. title = newTitle;

13. organization = newOrganization;

14. }

15.

16.public String getFirstName(){ return firstName; }

17.public String getLastName(){ return lastName; }

18.public String getTitle(){ return title; }

19.public String getOrganization(){ return organization; }

21.public void setFirstName(String newFirstName){ firstName = newFirstName; }

22.public void setLastName(String newLastName){ lastName = newLastName; }

23.public void setTitle(String newTitle){ title = newTitle; }

24.public void setOrganization(String newOrganization){ organization = newOrganization; }

26.public String toString(){

27.return firstName + SPACE + lastName;

28.}

29.}

Example A.103 Location.java

1.import java.io.Serializable;

2.public interface Location extends Serializable{

3.public String getLocation();

4.public void setLocation(String newLocation);

5.}

Example A.104 LocationImpl.java

1.public class LocationImpl implements Location{

2.private String location;

3.

4.public LocationImpl(){ }

5.public LocationImpl(String newLocation){

6.location = newLocation;

7.}

8.

9. public String getLocation(){ return location; }

10.

11.public void setLocation(String newLocation){ location = newLocation; }

12.

13.public String toString(){ return location; }

14.}

DataCreator and FileLoader are used to create a sample set of Appointment objects, and to manage their storage and retrieval from a file.

Example A.105 DataCreator.java

1.import java.io.Serializable;

2.import java.io.ObjectOutputStream;

3.import java.io.FileOutputStream;

4.import java.io.IOException;

5.import java.util.Calendar;

6.import java.util.Date;

7.import java.util.ArrayList;

274

8.public class DataCreator{

9.private static final String DEFAULT_FILE = "data.ser";

10.private static Calendar dateCreator = Calendar.getInstance();

12.public static void main(String [] args){

13.String fileName;

14.if (args.length == 1){

15. fileName = args[0];

16.}

17.else{

18. fileName = DEFAULT_FILE;

19.}

20.serialize(fileName);

21.}

22.

23.public static void serialize(String fileName){

24.try{

25. serializeToFile(createData(), fileName);

26.}

27.catch (IOException exc){

28. exc.printStackTrace();

29.}

30.}

32.private static Serializable createData(){

33.ArrayList appointments = new ArrayList();

34.ArrayList contacts = new ArrayList();

35.contacts.add(new ContactImpl("Test", "Subject", "Volunteer", "United Patterns

Consortium"));

36.Location location1 = new LocationImpl("Punxsutawney, PA");

37.appointments.add(new Appointment("Slowpokes anonymous", contacts, location1,

createDate(2001, 1, 1, 12, 01), createDate(2001, 1, 1, 12, 02)));

38.appointments.add(new Appointment("Java focus group", contacts, location1,

createDate(2001, 1, 1, 12, 30), createDate(2001, 1, 1, 14, 30)));

39.appointments.add(new Appointment("Something else", contacts, location1,

createDate(2001, 1, 1, 12, 01), createDate(2001, 1, 1, 12, 02)));

40.appointments.add(new Appointment("Yet another thingie", contacts, location1,

createDate(2001, 1, 1, 12, 01), createDate(2001, 1, 1, 12, 02)));

41.return appointments;

42.}

43.

44.private static void serializeToFile(Serializable content, String fileName) throws

IOException{

45.ObjectOutputStream serOut = new ObjectOutputStream(new FileOutputStream(fileName));

46.serOut.writeObject(content);

47.serOut.close();

48.}

49.

50.public static Date createDate(int year, int month, int day, int hour, int minute){

51.dateCreator.set(year, month, day, hour, minute);

52.return dateCreator.getTime();

53.}

54.}

Example A.106 FileLoader.java

1.import java.io.File;

2.import java.io.FileInputStream;

3.import java.io.FileOutputStream;

4.import java.io.IOException;

5.import java.io.ObjectInputStream;

6.import java.io.ObjectOutputStream;

7.import java.io.Serializable;

8.public class FileLoader{

9.public static Object loadData(File inputFile){

10.Object returnValue = null;

11.try{

12.

if (inputFile.exists()){

13.

if (inputFile.isFile()){

14.

ObjectInputStream readIn = new ObjectInputStream(new

15.

FileInputStream(inputFile));

returnValue = readIn.readObject();

16.

readIn.close();

17.

}

18.

else {

19.

System.err.println(inputFile + " is a directory.");

20.

}

21.

}

275

22.

else {

23.

System.err.println("File " + inputFile + " does not exist.");

24.

}

25.}

26.catch (ClassNotFoundException exc){

27.

exc.printStackTrace();

28.

 

29.}

30.catch (IOException exc){

31.

exc.printStackTrace();

32.

 

33.}

34.return returnValue;

35.}

36.public static void storeData(File outputFile, Serializable data){

37.try{

38.

ObjectOutputStream writeOut = new ObjectOutputStream(new

39.

FileOutputStream(outputFile));

writeOut.writeObject(data);

40.

writeOut.close();

41.}

42.catch (IOException exc){

43. exc.printStackTrace();

44.}

45.}

46.}

RunPattern runs the demonstration, creating a CalendarEditor object (which retrieves its initial entries from the file with test Appointments) and matching it with a StateGui object.

Example A.107 RunPattern.java

1.import java.io.File;

2.public class RunPattern{

3.public static void main(String [] arguments){

4.System.out.println("Example for the State pattern");

5.System.out.println();

6.

7.if (!(new File("appointments.ser").exists())){

8.

DataCreator.serialize("appointments.ser");

9.

}

10.

 

11.System.out.println("Creating CalendarEditor");

12.CalendarEditor appointmentBook = new CalendarEditor();

13.System.out.println("");

14.

15.System.out.println("Created. Appointments:");

16.System.out.println(appointmentBook.getAppointments());

18.System.out.println("Created. Creating GUI:");

19.StateGui application = new StateGui(appointmentBook);

20.application.createGui();

21.System.out.println("");

22.}

23.}

276

Strategy

For many of the collections in the Personal Information Manager, it would be useful to be able to organize and summarize individual entries. This demonstration uses the Strategy pattern to summarize entries in a ContactList, a collection used to store Contact objects.

Example A.108 ContactList.java

1.import java.io.Serializable;

2.import java.util.ArrayList;

3.public class ContactList implements Serializable{

4.private ArrayList contacts = new ArrayList();

5.private SummarizingStrategy summarizer;

6.

7.public ArrayList getContacts(){ return contacts; }

8.public Contact [] getContactsAsArray(){ return (Contact [])(contacts. toArray(new

Contact [1])); }

9.

10.public void setSummarizer(SummarizingStrategy newSummarizer){ summarizer =

newSummarizer; }

11. public void setContacts(ArrayList newContacts){ contacts = newContacts; }

12.

13.public void addContact(Contact element){

14.if (!contacts.contains(element)){

15. contacts.add(element);

16.}

17.}

18.public void removeContact(Contact element){

19.contacts.remove(element);

20.}

21.

22.public String summarize(){

23.return summarizer.summarize(getContactsAsArray());

24.}

25.

26.public String [] makeSummarizedList(){

27.return summarizer.makeSummarizedList(getContactsAsArray());

28.}

29.}

The ContactList has two methods, which can be used to provide summary information for the Contact objects

in the collection— summarize and make-SummarizedList. Both methods delegate to a SummarizingStrategy,

which can be set for the ContactList with the setSummarizer method.

Example A.109 SummarizingStrategy.java

1.public interface SummarizingStrategy{

2.public static final String EOL_STRING = System.getProperty("line.separator");

3.public static final String DELIMITER = ":";

4.public static final String COMMA = ",";

5.public static final String SPACE = " ";

6.

7.public String summarize(Contact [] contactList);

8.public String [] makeSummarizedList(Contact [] contactList);

9.}

SummarizingStrategy is an interface that defines the two delegate methods summarize and makeSummarizedList. The interface represents the Strategy in the design pattern. In this example, two classes

represent ConcreteStrategy objects: NameSummarizer and OrganizationSummarizer. Both classes summarize

the list of contacts; however, each provides a different set of information and groups the data differently.

The NameSummarizer class returns only the names of the contacts with the last name first. The class uses an inner class as a comparator (NameComparator) to ensure that all of the Contact entries are grouped in ascending order by both last and first name.

Example A.110 NameSummarizer.java

1.import java.text.Collator;

2.import java.util.Arrays;

3.import java.util.Comparator;

4.public class NameSummarizer implements SummarizingStrategy{

5.private Comparator comparator = new NameComparator();

277