| 
					Visitor Pattern - Customers Report - Java Sourcecode									 | 
							 
			 
			
		
				
			
				Visitor Pattern - Customers Report - Java SourcecodeJava Source Code Example for the Visitor Design Pattern - implementation version without reflection   Main.java - The Main class is the client object. It has a reference tot the Object structure. In our case the objects Structure is the Customers objects package com.oodesign.designpatterns.behavioral.visitor.impl; package com.oodesign.designpatterns.behavioral.visitor.customers;
  public class Main {
  	/** 	 * @param args 	 */ 	public static void main(String[] args) { 		// TODO Auto-generated method stub
  		Customer c = new Customer("customer1"); 		c.addOrder(new Order(".order1", "..item1")); 		c.addOrder(new Order(".order2", "..item1")); 		c.addOrder(new Order(".order3", "..item1")); 		 		Customer c2 = new Customer("customer2"); 		Order o = new Order(".order_a"); 		o.addItem(new Item("..item_a1")); 		o.addItem(new Item("..item_a2")); 		o.addItem(new Item("..item_a3")); 		c2.addOrder(o); 		c2.addOrder(new Order(".order_b", "..item_b1")); 		 		 		CustomerGroup customers = new CustomerGroup(); 		customers.addCustomer(c); 		customers.addCustomer(c2); 		 		GeneralReport visitor = new GeneralReport();  		 		customers.accept(visitor); 		 		visitor.displayResults(); 	} }  |  
 IVisitor and IVisitable interfaces  package com.oodesign.designpatterns.behavioral.visitor.customers;
  public interface IVisitable { 	  public void accept(IVisitor visitor); }
   |  
 package com.oodesign.designpatterns.behavioral.visitor.customers;
  public interface IVisitor { 	   public void visit(Customer customer); 	   public void visit(Order order); 	   public void visit(Item item);  }  |  
 GeneralReport is a visitor class and implements the IVisitor interface. Other Visitors (other reports or other types of visitors) can be added by implementing the IVisitor interface package com.oodesign.designpatterns.behavioral.visitor.customers;
  public class GeneralReport implements IVisitor{
  	private int customersNo; 	private int ordersNo; 	private int itemsNo;
  	public void visit(Customer customer) 	{ 		System.out.println(customer.getName()); 		customersNo ++; 	} 	public void visit(Order order) 	{ 		System.out.println(order.getName()); 		ordersNo++; 	} 	public void visit(Item item) 	{ 		System.out.println(item.getName()); 		itemsNo++; 	}
  	public void displayResults() 	{ 		System.out.println("Nr of customers:" + customersNo); 		System.out.println("Nr of orders:   " + ordersNo); 		System.out.println("Nr of itemss:   " + itemsNo); 	} }
   |  
 CustomerGroup, Customer, Order and Item are all visitable classes. A CustomerGroup represents a group of customers, each Customer can have one or more orders and each order can have one ore more Items.  package com.oodesign.designpatterns.behavioral.visitor.customers;
  import java.util.ArrayList; import java.util.Iterator;
  public class CustomerGroup { 	 	private ArrayList customers = new ArrayList();
  	public void accept(IVisitor visitor) 	{ 		for (Iterator it=customers.iterator(); it.hasNext();) 		{ 			((Customer)it.next()).accept(visitor); 		}		 	}
  	public void addCustomer(Customer customer) 	{ 		customers.add(customer); 	}	 	 }  |  
 package com.oodesign.designpatterns.behavioral.visitor.customers;
  import java.util.ArrayList; import java.util.Iterator;
  public class Customer implements IVisitable{ 	 	private String name; 	 	private ArrayList orders = new ArrayList(); 	 	public void accept(IVisitor visitor) 	{ 		visitor.visit(this);
  		for (Iterator it=orders.iterator(); it.hasNext();) 		{ 			((IVisitable)it.next()).accept(visitor); 		}		 	}
 
  	public String getName() { 		return name; 	}
 
  	public void setName(String name) { 		this.name = name; 	} 	 	public void addOrder(Order order) 	{ 		orders.add(order); 	} 	 	 	public Customer(String name) 	{ 		this.name = name; 	} }  |  
 package com.oodesign.designpatterns.behavioral.visitor.customers;
  import java.util.ArrayList; import java.util.Iterator;
  public class Order implements IVisitable {
  	private String name; 	 	private ArrayList items = new ArrayList(); 	 	public Order(String name) 	{ 		this.name = name; 	} 	 	public Order(String name, String itemName) 	{ 		this.name = name; 		this.addItem(new Item(itemName)); 	}	 	 	public String getName() { 		return name; 	}
  	public void setName(String name) { 		this.name = name; 	}
  	public void accept(IVisitor visitor) 	{ 		visitor.visit(this); 		 		for (Iterator it=items.iterator(); it.hasNext();) 		{ 			((Item)it.next()).accept(visitor); 		} 	} 	 	 	public void addItem(Item item) 	{ 		items.add(item); 	} }  |  
 package com.oodesign.designpatterns.behavioral.visitor.customers;
  public class Item implements IVisitable{ 	 	private String name; 	 	public void accept(IVisitor visitor) 	{ 		visitor.visit(this); 	}
  	 	public Item(String name) 	{ 		this.name = name; 	} 	 	public String getName() { 		return name; 	}
  	public void setName(String name) { 		this.name = name; 	} }  |  
  			 | 
		 
				 
		
		 
		
					
						
			           |