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) { } }
1. | Visitor pattern in Java | ||
2. | Visitor Pattern - Example |