1. Trang chủ
  2. » Công Nghệ Thông Tin

Applied Java Patterns Stephen phần 7 docx

36 253 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 36
Dung lượng 2,79 MB

Nội dung

218 Appendix A. Full Code Examples System Requirements This appendix includes full, runnable code examples for each pattern. Most of the patterns in the main part of this book included only the code that is crucial for your understanding of the pattern. This appendix includes all required class files, and a RunPattern class, which shows you how the code runs, and includes print statements specifying what occurs in the code. The following patterns use Remote Method Invocation ( RMI ) in their code examples: Callback, HOPP, Router, Session, Successive Update, Transaction, and Worker Thread. To run these examples, your computer must be network-enabled. Specifically, your system must be able to use TCP/IP sockets for networking and recognize " localhost " as a valid loopback IP address. The rmiregistry is started from the RunPattern file in each of these examples. Because rmiregistry is a server process, these examples will appear to block when they are finished. You must manually terminate the Java process to exit the rmiregistry. 219 Creational Pattern Code Examples Abstract Factory The following code samples show how international addresses and phone numbers can be supported in the Personal Information Manager with the Abstract Factory pattern. The AddressFactory interface represents the factory itself: Example A.1 AddressFactory.java 1. public interface AddressFactory{ 2. public Address createAddress(); 3. public PhoneNumber createPhoneNumber(); 4. } Note that the AddressFactory defines two factory methods, createAddress and createPhoneNumber. The methods produce the abstract products Address and PhoneNumber, which define methods that these products support. Example A.2 Address.java 1. public abstract class Address{ 2. private String street; 3. private String city; 4. private String region; 5. private String postalCode; 6. 7. public static final String EOL_STRING = 8. System.getProperty("line.separator"); 9. public static final String SPACE = " "; 10. 11. public String getStreet(){ return street; } 12. public String getCity(){ return city; } 13. public String getPostalCode(){ return postalCode; } 14. public String getRegion(){ return region; } 15. public abstract String getCountry(); 16. 17. public String getFullAddress(){ 18. return street + EOL_STRING + 19. city + SPACE + postalCode + EOL_STRING; 20. } 21. 22. public void setStreet(String newStreet){ street = newStreet; } 23. public void setCity(String newCity){ city = newCity; } 24. public void setRegion(String newRegion){ region = newRegion; } 25. public void setPostalCode(String newPostalCode){ postalCode = newPostalCode; } 26. } Example A.3 PhoneNumber.java 1. public abstract class PhoneNumber{ 2. private String phoneNumber; 3. public abstract String getCountryCode(); 4. 5. public String getPhoneNumber(){ return phoneNumber; } 6. 7. public void setPhoneNumber(String newNumber){ 8. try{ 9. Long.parseLong(newNumber); 10. phoneNumber = newNumber; 11. } 12. catch (NumberFormatException exc){ 13. } 14. } 15. } Address and PhoneNumber are abstract classes in this example, but could easily be defined as interfaces if you did not need to define code to be used for all concrete products. To provide concrete functionality for the system, you need to create Concrete Factory and Concrete Product classes. In this case, you define a class that implements AddressFactory, and subclass the Address and PhoneNumber classes. The three following classes show how to do this for U.S. address information. Example A.4 USAddressFactory.java 220 1. public class USAddressFactory implements AddressFactory{ 2. public Address createAddress(){ 3. return new USAddress(); 4. } 5. 6. public PhoneNumber createPhoneNumber(){ 7. return new USPhoneNumber(); 8. } 9. } Example A.5 USAddress.java 1. public class USAddress extends Address{ 2. private static final String COUNTRY = "UNITED STATES"; 3. private static final String COMMA = ","; 4. 5. public String getCountry(){ return COUNTRY; } 6. 7. public String getFullAddress(){ 8. return getStreet() + EOL_STRING + 9. getCity() + COMMA + SPACE + getRegion() + 10. SPACE + getPostalCode() + EOL_STRING + 11. COUNTRY + EOL_STRING; 12. } 13. } Example A.6 USPhoneNumber.java 1. public class USPhoneNumber extends PhoneNumber{ 2. private static final String COUNTRY_CODE = "01"; 3. private static final int NUMBER_LENGTH = 10; 4. 5. public String getCountryCode(){ return COUNTRY_CODE; } 6. 7. public void setPhoneNumber(String newNumber){ 8. if (newNumber.length() == NUMBER_LENGTH){ 9. super.setPhoneNumber(newNumber); 10. } 11. } 12. } The generic framework from AddressFactory, Address, and PhoneNumber makes it easy to extend the system to support additional countries. With each additional country, define an additional Concrete Factory class and a matching Concrete Product class. These are files for French address information. Example A.7 FrenchAddressFactory.java 1. public class FrenchAddressFactory implements AddressFactory{ 2. public Address createAddress(){ 3. return new FrenchAddress(); 4. } 5. 6. public PhoneNumber createPhoneNumber(){ 7. return new FrenchPhoneNumber(); 8. } 9. } Example A.8 FrenchAddress.java 1. public class FrenchAddress extends Address{ 2. private static final String COUNTRY = "FRANCE"; 3. 4. public String getCountry(){ return COUNTRY; } 5. 6. public String getFullAddress(){ 7. return getStreet() + EOL_STRING + 8. getPostalCode() + SPACE + getCity() + 9. EOL_STRING + COUNTRY + EOL_STRING; 10. } 11. } Example A.9 FrenchPhoneNumber.java 1. public class FrenchPhoneNumber extends PhoneNumber{ 2. private static final String COUNTRY_CODE = "33"; 3. private static final int NUMBER_LENGTH = 9; 4. 5. public String getCountryCode(){ return COUNTRY_CODE; } 221 6. 7. public void setPhoneNumber(String newNumber){ 8. if (newNumber.length() == NUMBER_LENGTH){ 9. super.setPhoneNumber(newNumber); 10. } 11. } 12. } The RunPattern class provides an example of the AbstractFactory in use. It uses the USAddressFactory and the FrenchAddressFactory to create two different sets of address/phone number combinations. It is significant that once the factory objects have been loaded, we can deal with their products by using the Address and PhoneNumber interfaces. There are no method calls which depend on the distinction between a USAddress and a FrenchAddress. Example A.10 RunPattern.java 1. public class RunPattern{ 2. public static void main(String [] arguments){ 3. System.out.println("Example for the AbstractFactory pattern"); 4. System.out.println(); 5. System.out.println(" (take a look in the RunPattern code. Notice that you can"); 6. System.out.println(" use the Address and PhoneNumber classes when writing"); 7. System.out.println(" almost all of the code. This allows you to write a very"); 8. System.out.println(" generic framework, and plug in Concrete Factories"); 9. System.out.println(" and Products to specialize the behavior of your code)"); 10. System.out.println(); 11. 12. System.out.println("Creating U.S. Address and Phone Number:"); 13. AddressFactory usAddressFactory = new USAddressFactory(); 14. Address usAddress = usAddressFactory.createAddress(); 15. PhoneNumber usPhone = usAddressFactory.createPhoneNumber(); 16. 17. usAddress.setStreet("142 Lois Lane"); 18. usAddress.setCity("Metropolis"); 19. usAddress.setRegion("WY"); 20. usAddress.setPostalCode("54321"); 21. usPhone.setPhoneNumber("7039214722"); 22. 23. System.out.println("U.S. address:"); 24. System.out.println(usAddress.getFullAddress()); 25. System.out.println("U.S. phone number:"); 26. System.out.println(usPhone.getPhoneNumber()); 27. System.out.println(); 28. System.out.println(); 29. 30. System.out.println("Creating French Address and Phone Number:"); 31. AddressFactory frenchAddressFactory = new FrenchAddressFactory(); 32. Address frenchAddress = frenchAddressFactory.createAddress(); 33. PhoneNumber frenchPhone = frenchAddressFactory.createPhoneNumber(); 34. 35. frenchAddress.setStreet("21 Rue Victor Hugo"); 36. frenchAddress.setCity("Courbevoie"); 37. frenchAddress.setPostalCode("40792"); 38. frenchPhone.setPhoneNumber("011324290"); 39. 40. System.out.println("French address:"); 41. System.out.println(frenchAddress.getFullAddress()); 42. System.out.println("French phone number:"); 43. System.out.println(frenchPhone.getPhoneNumber()); 44. } 45. } TEAMFLY TEAM FLY PRESENTS 222 Builder This code example shows how to use the Builder pattern to create an appointment for the PIM. The following list summarizes each class’s purpose: AppointmentBuilder, MeetingBuilder – Builder classes Scheduler – Director class Appointment – Product Address, Contact – Support classes, used to hold information relevant to the Appointment InformationRequiredException – An Exception class produced when more data is required For the base pattern, the AppointmentBuilder manages the creation of a complex product, which is an Appointment in this example. The AppointmentBuilder uses a series of build methods— buildAppointment, buildLocation, buildDates, and buildAttendees — to create an Appointment and populate it. Example A.11 AppointmentBuilder.java 1. import java.util.Date; 2. import java.util.ArrayList; 3. 4. public class AppointmentBuilder{ 5. 6. public static final int START_DATE_REQUIRED = 1; 7. public static final int END_DATE_REQUIRED = 2; 8. public static final int DESCRIPTION_REQUIRED = 4; 9. public static final int ATTENDEE_REQUIRED = 8; 10. public static final int LOCATION_REQUIRED = 16; 11. 12. protected Appointment appointment; 13. 14. protected int requiredElements; 15. 16. public void buildAppointment(){ 17. appointment = new Appointment(); 18. } 19. 20. public void buildDates(Date startDate, Date endDate){ 21. Date currentDate = new Date(); 22. if ((startDate != null) && (startDate.after(currentDate))){ 23. appointment.setStartDate(startDate); 24. } 25. if ((endDate != null) && (endDate.after(startDate))){ 26. appointment.setEndDate(endDate); 27. } 28. } 29. 30. public void buildDescription(String newDescription){ 31. appointment.setDescription(newDescription); 32. } 33. 34. public void buildAttendees(ArrayList attendees){ 35. if ((attendees != null) && (!attendees.isEmpty())){ 36. appointment.setAttendees(attendees); 37. } 38. } 39. 40. public void buildLocation(Location newLocation){ 41. if (newLocation != null){ 42. appointment.setLocation(newLocation); 43. } 44. } 45. 46. public Appointment getAppointment() throws InformationRequiredException{ 47. requiredElements = 0; 48. 49. if (appointment.getStartDate() == null){ 50. requiredElements += START_DATE_REQUIRED; 51. } 52. 223 53. if (appointment.getLocation() == null){ 54. requiredElements += LOCATION_REQUIRED; 55. } 56. 57. if (appointment.getAttendees().isEmpty()){ 58. requiredElements += ATTENDEE_REQUIRED; 59. } 60. 61. if (requiredElements > 0){ 62. throw new InformationRequiredException(requiredElements); 63. } 64. return appointment; 65. } 66. 67. public int getRequiredElements(){ return requiredElements; } 68. } Example A.12 Appointment.java 1. import java.util.ArrayList; 2. import java.util.Date; 3. public class Appointment{ 4. private Date startDate; 5. private Date endDate; 6. private String description; 7. private ArrayList attendees = new ArrayList(); 8. private Location location; 9. public static final String EOL_STRING = 10. System.getProperty("line.separator"); 11. 12. public Date getStartDate(){ return startDate; } 13. public Date getEndDate(){ return endDate; } 14. public String getDescription(){ return description; } 15. public ArrayList getAttendees(){ return attendees; } 16. public Location getLocation(){ return location; } 17. 18. public void setDescription(String newDescription){ description = newDescription; } 19. public void setLocation(Location newLocation){ location = newLocation; } 20. public void setStartDate(Date newStartDate){ startDate = newStartDate; } 21. public void setEndDate(Date newEndDate){ endDate = newEndDate; } 22. public void setAttendees(ArrayList newAttendees){ 23. if (newAttendees != null){ 24. attendees = newAttendees; 25. } 26. } 27. 28. public void addAttendee(Contact attendee){ 29. if (!attendees.contains(attendee)){ 30. attendees.add(attendee); 31. } 32. } 33. 34. public void removeAttendee(Contact attendee){ 35. attendees.remove(attendee); 36. } 37. 38. public String toString(){ 39. return " Description: " + description + EOL_STRING + 40. " Start Date: " + startDate + EOL_STRING + 41. " End Date: " + endDate + EOL_STRING + 42. " Location: " + location + EOL_STRING + 43. " Attendees: " + attendees; 44. } 45. } The Scheduler class makes calls to the AppointmentBuilder, managing the creation process through the method createAppointment. Example A.13 Scheduler.java 1. import java.util.Date; 2. import java.util.ArrayList; 3. public class Scheduler{ 4. public Appointment createAppointment(AppointmentBuilder builder, 5. Date startDate, Date endDate, String description, 6. Location location, ArrayList attendees) throws InformationRequiredException { 7. if (builder == null){ 8. builder = new AppointmentBuilder(); 224 9. } 10. builder.buildAppointment(); 11. builder.buildDates(startDate, endDate); 12. builder.buildDescription(description); 13. builder.buildAttendees(attendees); 14. builder.buildLocation(location); 15. return builder.getAppointment(); 16. } 17. } The responsibilities of each class are summarized here: Scheduler – Calls the appropriate build methods on AppointmentBuilder; returns a complete Appointment object to its caller. AppointmentBuilder – Contains build methods and enforces business rules; creates the actual Appointment object. Appointment – Holds information about an appointment. The MeetingBuilder class in Example A.14 demonstrates one of the benefits of using the Builder pattern. To add additional rules for the Appointment, extend the existing builder. In this case, the MeetingBuilder enforces an additional constraint: for an Appointment that is a meeting, both start and end dates must be specified. Example A.14 MeetingBuilder.java 1. import java.util.Date; 2. import java.util.Vector; 3. 4. public class MeetingBuilder extends AppointmentBuilder{ 5. public Appointment getAppointment() throws InformationRequiredException{ 6. try{ 7. super.getAppointment(); 8. } 9. finally{ 10. if (appointment.getEndDate() == null){ 11. requiredElements += END_DATE_REQUIRED; 12. } 13. 14. if (requiredElements > 0){ 15. throw new InformationRequiredException(requiredElements); 16. } 17. } 18. return appointment; 19. } 20. } Support classes used for this example include the class InformationRequiredException and the interfaces Location and Contact. The Address and Contact interfaces are marker interfaces used to represent supporting information for the Appointment in this example; their implementation is represented by the LocationImpl and ContactImpl classes. Example A.15 InformationRequiredException.java 1. public class InformationRequiredException extends Exception{ 2. private static final String MESSAGE = "Appointment cannot be created because further information is required"; 3. public static final int START_DATE_REQUIRED = 1; 4. public static final int END_DATE_REQUIRED = 2; 5. public static final int DESCRIPTION_REQUIRED = 4; 6. public static final int ATTENDEE_REQUIRED = 8; 7. public static final int LOCATION_REQUIRED = 16; 8. private int informationRequired; 9. 10. public InformationRequiredException(int itemsRequired){ 11. super(MESSAGE); 12. informationRequired = itemsRequired; 13. } 14. 15. public int getInformationRequired(){ return informationRequired; } 16. } Example A.16 Location.java 225 1. import java.io.Serializable; 2. public interface Location extends Serializable { 3. public String getLocation(); 4. public void setLocation(String newLocation); 5. } Example A.17 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. } Example A.18 Contact.java 1. import java.io.Serializable; 2. public interface Contact extends Serializable{ 3. public static final String SPACE = " "; 4. public String getFirstName(); 5. public String getLastName(); 6. public String getTitle(); 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.19 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(String newFirstName, String newLastName, 8. String newTitle, String newOrganization){ 9. firstName = newFirstName; 10. lastName = newLastName; 11. title = newTitle; 12. organization = newOrganization; 13. } 14. 15. public String getFirstName(){ return firstName; } 16. public String getLastName(){ return lastName; } 17. public String getTitle(){ return title; } 18. public String getOrganization(){ return organization; } 19. 20. public void setFirstName(String newFirstName){ firstName = newFirstName; } 21. public void setLastName(String newLastName){ lastName = newLastName; } 22. public void setTitle(String newTitle){ title = newTitle; } 23. public void setOrganization(String newOrganization){ organization = newOrganization; } 24. 25. public String toString(){ 26. return firstName + SPACE + lastName; 27. } 28. } The RunPattern file executes this example. It demonstrates the use of the Builder pattern by creating three separate Appointment objects using the AppointmentBuilder and MeetingBuilder. Example A.20 RunPattern.java 1. import java.util.Calendar; 2. import java.util.Date; 3. import java.util.ArrayList; 226 4. public class RunPattern{ 5. private static Calendar dateCreator = Calendar.getInstance(); 6. 7. public static void main(String [] arguments){ 8. Appointment appt = null; 9. 10. System.out.println("Example for the Builder pattern"); 11. System.out.println(); 12. System.out.println("This example demonstrates the use of the Builder"); 13. System.out.println("pattern to create Appointment objects for the PIM."); 14. System.out.println(); 15. 16. System.out.println("Creating a Scheduler for the example."); 17. Scheduler pimScheduler = new Scheduler(); 18. 19. System.out.println("Creating an AppointmentBuilder for the example."); 20. System.out.println(); 21. AppointmentBuilder apptBuilder = new AppointmentBuilder(); 22. try{ 23. System.out.println("Creating a new Appointment with an AppointmentBuilder"); 24. appt = pimScheduler.createAppointment( 25. apptBuilder, createDate(2066, 9, 22, 12, 30), 26. null, "Trek convention", new LocationImpl("Fargo, ND"), 27. createAttendees(4)); 28. System.out.println("Successfully created an Appointment."); 29. System.out.println("Appointment information:"); 30. System.out.println(appt); 31. System.out.println(); 32. } 33. catch (InformationRequiredException exc){ 34. printExceptions(exc); 35. } 36. 37. System.out.println("Creating a MeetingBuilder for the example."); 38. MeetingBuilder mtgBuilder = new MeetingBuilder(); 39. try{ 40. System.out.println("Creating a new Appointment with a MeetingBuilder"); 41. System.out.println("(notice that the same create arguments will produce"); 42. System.out.println(" an exception, since the MeetingBuilder enforces a"); 43. System.out.println(" mandatory end date)"); 44. appt = pimScheduler.createAppointment( 45. mtgBuilder, createDate(2066, 9, 22, 12, 30), 46. null, "Trek convention", new LocationImpl("Fargo, ND"), 47. createAttendees(4)); 48. System.out.println("Successfully created an Appointment."); 49. System.out.println("Appointment information:"); 50. System.out.println(appt); 51. System.out.println(); 52. } 53. catch (InformationRequiredException exc){ 54. printExceptions(exc); 55. } 56. 57. System.out.println("Creating a new Appointment with a MeetingBuilder"); 58. System.out.println("(This time, the MeetingBuilder will provide an end date)"); 59. try{ 60. appt = pimScheduler.createAppointment( 61. mtgBuilder, 62. createDate(2002, 4, 1, 10, 00), 63. createDate(2002, 4, 1, 11, 30), 64. "OOO Meeting", 65. new LocationImpl("Butte, MT"), 66. createAttendees(2)); 67. System.out.println("Successfully created an Appointment."); 68. System.out.println("Appointment information:"); 69. System.out.println(appt); 70. System.out.println(); 71. } 72. catch (InformationRequiredException exc){ 73. printExceptions(exc); 74. } 75. } 76. 77. public static Date createDate(int year, int month, int day, int hour, int minute){ 78. dateCreator.set(year, month, day, hour, minute); 79. return dateCreator.getTime(); 80. } 81. 227 82. public static ArrayList createAttendees(int numberToCreate){ 83. ArrayList group = new ArrayList(); 84. for (int i = 0; i < numberToCreate; i++){ 85. group.add(new ContactImpl("John", getLastName(i), "Employee (nonexempt)", "Yoyodyne Corporation")); 86. } 87. return group; 88. } 89. 90. public static String getLastName(int index){ 91. String name = ""; 92. switch (index % 6){ 93. case 0: name = "Worfin"; 94. break; 95. case 1: name = "Smallberries"; 96. break; 97. case 2: name = "Bigbootee"; 98. break; 99. case 3: name = "Haugland"; 100. break; 101. case 4: name = "Maassen"; 102. break; 103. case 5: name = "Sterling"; 104. break; 105. } 106. return name; 107. } 108. 109. public static void printExceptions(InformationRequiredException exc){ 110. int statusCode = exc.getInformationRequired(); 111. 112. System.out.println("Unable to create Appointment: additional information is required"); 113. if ((statusCode & InformationRequiredException.START_DATE_REQUIRED) > 0){ 114. System.out.println(" A start date is required for this appointment to be complete."); 115. } 116. if ((statusCode & InformationRequiredException.END_DATE_REQUIRED) > 0){ 117. System.out.println(" An end date is required for this appointment to be complete."); 118. } 119. if ((statusCode & InformationRequiredException.DESCRIPTION_REQUIRED) > 0){ 120. System.out.println(" A description is required for this appointment to be complete."); 121. } 122. if ((statusCode & InformationRequiredException.ATTENDEE_REQUIRED) > 0){ 123. System.out.println(" At least one attendee is required for this appointment to be complete."); 124. } 125. if ((statusCode & InformationRequiredException.LOCATION_REQUIRED) > 0){ 126. System.out.println(" A location is required for this appointment to be complete."); 127. } 128. System.out.println(); 129. } 130. } [...]... RunPattern .java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 import java. awt.Container; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextArea; import java. awt.event.ActionEvent;... void createGui(){ mainFrame = new JFrame("Singleton Pattern Example"); 234 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 Container content = mainFrame.getContentPane(); content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));... redo = new JButton("Redo Location"); exit = new JButton("Exit"); controlPanel.add(update); 244 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 1 07 108 109 110 111 112 113 114 115 116 1 17 118 controlPanel.add(undo); controlPanel.add(redo); controlPanel.add(exit); content.add(controlPanel);... BoxLayout(content, BoxLayout.Y_AXIS)); editorPanel = new JPanel(); editorPanel.add(editor.getGUI()); content.add(editorPanel); 229 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 displayPanel = new JPanel(); display = new JTextArea(10, 40); display.setEditable(false); displayPanel.add(display); content.add(displayPanel);... CommandGui .java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 import java. awt.Container; import java. awt.event.ActionListener; import java. awt.event.WindowAdapter; import java. awt.event.ActionEvent; import java. awt.event.WindowEvent; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JComponent;... EditorGui .java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 import java. awt.Container; import java. awt.event.ActionListener; import java. awt.event.WindowAdapter; import java. awt.event.ActionEvent; import java. awt.event.WindowEvent; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JPanel;... display Example A.30 SingletonGUI .java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import java. awt.Container; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextArea; import java. awt.event.ActionEvent; import java. awt.event.ActionListener; import java. awt.event.WindowAdapter; import java. awt.event.WindowEvent; public... of the information, which could be included in an entry in the PIM Example A.23 Contact .java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 import import import import import import java. awt.GridLayout; java. io.Serializable; javax.swing.JComponent; javax.swing.JLabel; javax.swing.JPanel; javax.swing.JTextField; public class Contact implements Editable, Serializable { private... method returns the parent, which will be another Task or the Project Example A.34 Task .java 238 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 import java. util.ArrayList; import java. util.ListIterator; public class Task implements ProjectItem{ private String name;... creating a Contact and an EditorGui object The EditorGui constructor sets the ItemEditor for the example Example A.25 RunPattern .java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 import import import import javax.swing.JComponent; javax.swing.JFrame; java. awt.event.WindowAdapter; java. awt.event.WindowEvent; public class RunPattern{ public static void main(String [] arguments){ System.out.println("Example . 67. undoCommand(); 68. } 69. else if (originator == refresh){ 70 . refreshDisplay(""); 71 . } 72 . else if (originator == exit){ 73 . exitApplication(); 74 . } 75 . } 76 . 2 37 77. . undo){ 67. undoCommand(); 68. } 69. else if (originator == refresh){ 70 . refreshDisplay(""); 71 . } 72 . else if (originator == exit){ 73 . exitApplication(); 74 . } 75 . } 76 . 77 71 . } 72 . catch (InformationRequiredException exc){ 73 . printExceptions(exc); 74 . } 75 . } 76 . 77 . public static Date createDate(int year, int month, int day, int hour, int minute){ 78 .

Ngày đăng: 09/08/2014, 12:22