Mega Code Archive

 
Categories / Java / Design Pattern
 

Visitor Pattern 1

//[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.util.ArrayList; import java.util.Iterator; public class RunVisitorPattern {   public static void main(String[] arguments) {     System.out.println("Example for the Visitor pattern");     System.out.println();     System.out         .println("This sample will use a ProjectCostVisitor to calculate");     System.out.println(" the total amount required to complete a Project.");     System.out.println();     System.out.println("Deserializing a test Project for Visitor pattern");     System.out.println();     if (!(new File("data.ser").exists())) {       DataCreator.serialize("data.ser");     }     Project project = (Project) (DataRetriever.deserializeData("data.ser"));     System.out         .println("Creating a ProjectCostVisitor, to calculate the total cost of the project.");     ProjectCostVisitor visitor = new ProjectCostVisitor();     visitor.setHourlyRate(100);     System.out         .println("Moving throuhg the Project, calculating total cost");     System.out         .println(" by passing the Visitor to each of the ProjectItems.");     visitProjectItems(project, visitor);     System.out.println("The total cost for the project is: "         + visitor.getTotalCost());   }   private static void visitProjectItems(ProjectItem item,       ProjectVisitor visitor) {     item.accept(visitor);     if (item.getProjectItems() != null) {       Iterator subElements = item.getProjectItems().iterator();       while (subElements.hasNext()) {         visitProjectItems((ProjectItem) subElements.next(), visitor);       }     }   } } 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 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() {     return timeRequired;   }   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 void accept(ProjectVisitor v) {     v.visitTask(this);   } } class Deliverable implements ProjectItem {   private String name;   private String description;   private Contact owner;   private double materialsCost;   private double productionCost;   public Deliverable() {   }   public Deliverable(String newName, String newDescription, Contact newOwner,       double newMaterialsCost, double newProductionCost) {     name = newName;     description = newDescription;     owner = newOwner;     materialsCost = newMaterialsCost;     productionCost = newProductionCost;   }   public String getName() {     return name;   }   public String getDescription() {     return description;   }   public Contact getOwner() {     return owner;   }   public double getMaterialsCost() {     return materialsCost;   }   public double getProductionCost() {     return productionCost;   }   public void setMaterialsCost(double newCost) {     materialsCost = newCost;   }   public void setProductionCost(double newCost) {     productionCost = newCost;   }   public void setName(String newName) {     name = newName;   }   public void setDescription(String newDescription) {     description = newDescription;   }   public void setOwner(Contact newOwner) {     owner = newOwner;   }   public void accept(ProjectVisitor v) {     v.visitDeliverable(this);   }   public ArrayList getProjectItems() {     return null;   } } interface ProjectVisitor {   public void visitDependentTask(DependentTask p);   public void visitDeliverable(Deliverable p);   public void visitTask(Task p);   public void visitProject(Project p); } interface ProjectItem extends Serializable {   public void accept(ProjectVisitor v);   public ArrayList getProjectItems(); } 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 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(createData(), fileName);     } catch (IOException exc) {       exc.printStackTrace();     }   }   private static Serializable createData() {     Contact contact = new ContactImpl("Test", "Subject", "Volunteer",         "United Patterns Consortium");     Project project = new Project("Project 1", "Test Project");     Task task1 = new Task("Task 1", contact, 1);     Task task2 = new Task("Task 2", contact, 1);     project.addProjectItem(new Deliverable("Deliverable 1",         "Layer 1 deliverable", contact, 50.0, 50.0));     project.addProjectItem(task1);     project.addProjectItem(task2);     project.addProjectItem(new DependentTask("Dependent Task 1", contact,         1, 1));     Task task3 = new Task("Task 3", contact, 1);     Task task4 = new Task("Task 4", contact, 1);     Task task5 = new Task("Task 5", contact, 1);     Task task6 = new Task("Task 6", contact, 1);     DependentTask dtask2 = new DependentTask("Dependent Task 2", contact,         1, 1);     task1.addProjectItem(task3);     task1.addProjectItem(task4);     task1.addProjectItem(task5);     task1.addProjectItem(dtask2);     dtask2.addDependentTask(task5);     dtask2.addDependentTask(task6);     dtask2.addProjectItem(new Deliverable("Deliverable 2",         "Layer 3 deliverable", contact, 50.0, 50.0));     task3.addProjectItem(new Deliverable("Deliverable 3",         "Layer 3 deliverable", contact, 50.0, 50.0));     task4.addProjectItem(new Task("Task 7", contact, 1));     task4.addProjectItem(new Deliverable("Deliverable 4",         "Layer 3 deliverable", contact, 50.0, 50.0));     return project;   }   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 DependentTask extends Task {   private ArrayList dependentTasks = new ArrayList();   private double dependencyWeightingFactor;   public DependentTask() {   }   public DependentTask(String newName, Contact newOwner,       double newTimeRequired, double newWeightingFactor) {     super(newName, newOwner, newTimeRequired);     dependencyWeightingFactor = newWeightingFactor;   }   public ArrayList getDependentTasks() {     return dependentTasks;   }   public double getDependencyWeightingFactor() {     return dependencyWeightingFactor;   }   public void setDependencyWeightingFactor(double newFactor) {     dependencyWeightingFactor = newFactor;   }   public void addDependentTask(Task element) {     if (!dependentTasks.contains(element)) {       dependentTasks.add(element);     }   }   public void removeDependentTask(Task element) {     dependentTasks.remove(element);   }   public void accept(ProjectVisitor v) {     v.visitDependentTask(this);   } } class Project implements ProjectItem {   private String name;   private String description;   private ArrayList projectItems = new ArrayList();   public Project() {   }   public Project(String newName, String newDescription) {     name = newName;     description = newDescription;   }   public String getName() {     return name;   }   public String getDescription() {     return description;   }   public ArrayList getProjectItems() {     return projectItems;   }   public void setName(String newName) {     name = newName;   }   public void setDescription(String newDescription) {     description = newDescription;   }   public void addProjectItem(ProjectItem element) {     if (!projectItems.contains(element)) {       projectItems.add(element);     }   }   public void removeProjectItem(ProjectItem element) {     projectItems.remove(element);   }   public void accept(ProjectVisitor v) {     v.visitProject(this);   } } class ProjectCostVisitor implements ProjectVisitor {   private double totalCost;   private double hourlyRate;   public double getHourlyRate() {     return hourlyRate;   }   public double getTotalCost() {     return totalCost;   }   public void setHourlyRate(double rate) {     hourlyRate = rate;   }   public void resetTotalCost() {     totalCost = 0.0;   }   public void visitDependentTask(DependentTask p) {     double taskCost = p.getTimeRequired() * hourlyRate;     taskCost *= p.getDependencyWeightingFactor();     totalCost += taskCost;   }   public void visitDeliverable(Deliverable p) {     totalCost += p.getMaterialsCost() + p.getProductionCost();   }   public void visitTask(Task p) {     totalCost += p.getTimeRequired() * hourlyRate;   }   public void visitProject(Project p) {   } }