Mega Code Archive

 
Categories / Java / Design Pattern
 

Decorator Pattern 1

//[C] 2002 Sun Microsystems, Inc.--- import java.io.File; import java.io.Serializable; import java.util.ArrayList; import java.util.Iterator; public class RunDecoratorPattern {     public static void main(String [] arguments){         System.out.println("Example for the Decorator pattern");         System.out.println();         System.out.println("This demonstration will show how Decorator classes can be used");         System.out.println(" to extend the basic functionality of ProjectItems. The Task and");         System.out.println(" Deliverable classes provide the basic ProjectItems, and their");         System.out.println(" functionality will be extended by adding subclasses of the");         System.out.println(" abstract class ProjectDecorator.");         System.out.println();         System.out.println("Note that the toString method has been overridden for all ProjectItems,");         System.out.println(" to more effectively show how Decorators are associated with their");         System.out.println(" ProjectItems.");         System.out.println();                  System.out.println("Creating ProjectItems.");         Contact contact1 = new ContactImpl("Simone", "Roberto", "Head Researcher and Chief Archivist", "Institute for Advanced (Java) Studies");         Task task1 = new Task("Perform months of diligent research", contact1, 20.0);         Task task2 = new Task("Obtain grant from World Java Foundation", contact1, 40.0);         Deliverable deliverable1 = new Deliverable("Java History", "Comprehensive history of the design of all Java APIs", contact1);         System.out.println("ProjectItem objects created. Results:");         System.out.println(task1);         System.out.println(task2);         System.out.println(deliverable1);         System.out.println();                  System.out.println("Creating decorators");         ProjectDecorator decorator1 = new SupportedProjectItem(new File("JavaHistory.txt"));         ProjectDecorator decorator2 = new DependentProjectItem(task2);         System.out.println("Decorators created. Adding decorators to the first task");         decorator1.setProjectItem(task1);         decorator2.setProjectItem(decorator1);         System.out.println();         System.out.println("Decorators added. Results");         System.out.println(decorator2);                  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 Deliverable implements ProjectItem{     private String name;     private String description;     private Contact owner;          public Deliverable(){ }     public Deliverable(String newName, String newDescription,         Contact newOwner){         name = newName;         description = newDescription;         owner = newOwner;     }          public String getName(){ return name; }     public String getDescription(){ return description; }     public Contact getOwner(){ return owner; }     public double getTimeRequired(){ return 0; }          public void setName(String newName){ name = newName; }     public void setDescription(String newDescription){ description = newDescription; }     public void setOwner(Contact newOwner){ owner = newOwner; }          public String toString(){         return "Deliverable: " + name;     } } class DependentProjectItem extends ProjectDecorator{     private ProjectItem dependentItem;          public DependentProjectItem(){ }     public DependentProjectItem(ProjectItem newDependentItem){         dependentItem = newDependentItem;     }          public ProjectItem getDependentItem(){ return dependentItem; }          public void setDependentItem(ProjectItem newDependentItem){ dependentItem = newDependentItem; }          public String toString(){         return getProjectItem().toString() + EOL_STRING             + "\tProjectItem dependent on: " + dependentItem;     } } abstract class ProjectDecorator implements ProjectItem{     private ProjectItem projectItem;          protected ProjectItem getProjectItem(){ return projectItem; }     public void setProjectItem(ProjectItem newProjectItem){ projectItem = newProjectItem; }          public double getTimeRequired(){         return projectItem.getTimeRequired();     } } interface ProjectItem extends Serializable{     public static final String EOL_STRING = System.getProperty("line.separator");     public double getTimeRequired(); } class Task implements ProjectItem{     private String name;     private ArrayList projectItems = new ArrayList();     private Contact owner;     private double timeRequired;          public Task(){ }     public Task(String newName, Contact newOwner,         double newTimeRequired){         name = newName;         owner = newOwner;         timeRequired = newTimeRequired;     }          public String getName(){ return name; }     public ArrayList getProjectItems(){ return projectItems; }     public Contact getOwner(){ return owner; }     public double getTimeRequired(){         double totalTime = timeRequired;         Iterator items = projectItems.iterator();         while(items.hasNext()){             ProjectItem item = (ProjectItem)items.next();             totalTime += item.getTimeRequired();         }         return totalTime;     }          public void setName(String newName){ name = newName; }     public void setOwner(Contact newOwner){ owner = newOwner; }     public void setTimeRequired(double newTimeRequired){ timeRequired = newTimeRequired; }          public void addProjectItem(ProjectItem element){         if (!projectItems.contains(element)){             projectItems.add(element);         }     }     public void removeProjectItem(ProjectItem element){         projectItems.remove(element);     }          public String toString(){         return "Task: " + name;     } } class SupportedProjectItem extends ProjectDecorator{     private ArrayList supportingDocuments = new ArrayList();          public SupportedProjectItem(){ }     public SupportedProjectItem(File newSupportingDocument){         addSupportingDocument(newSupportingDocument);     }          public ArrayList getSupportingDocuments(){         return supportingDocuments;     }          public void addSupportingDocument(File document){         if (!supportingDocuments.contains(document)){             supportingDocuments.add(document);         }     }          public void removeSupportingDocument(File document){         supportingDocuments.remove(document);     }          public String toString(){         return getProjectItem().toString() + EOL_STRING             + "\tSupporting Documents: " + supportingDocuments;     } }