Categories
Algorithms & Design Design Pattern

Visitor Pattern

ComputerElement.java

public abstract class ComputerElement {
	
	public double price;//prices are in INR
	
	public ComputerElement(double price){
		this.price=price;
	}
	
	public double getPrice() {
		return price;
	}

	public void setPrice(double price) {
		this.price = price;
	}

	public abstract double accept(ComputerElementVisitor visitor);
	
	
}

ComputerElementVisitor.java

public abstract class ComputerElementVisitor {

	public abstract double visit(CRTMonitor crtMonitor);
	public abstract double visit(Keyboard keyboard);
	public abstract double visit(LCDMonitor lcdMonitor);
	public abstract double visit(Mouse mouse);
	public abstract double visit(WirelessKeyboard wirelessKeyboard);
	public abstract double visit(WirelessMouse wirelessMouse);
}

CRTMonitor.java

public class CRTMonitor extends ComputerElement {

	public CRTMonitor(double price){
		super(price);
	}
	
	@Override
	public double accept(ComputerElementVisitor visitor) {
		// TODO Auto-generated method stub
		return visitor.visit(this);
	}

}

LCDMonitor.java

public class LCDMonitor extends ComputerElement {

	public LCDMonitor(double price){
		super(price);
	}
	@Override
	public double accept(ComputerElementVisitor visitor) {
		// TODO Auto-generated method stub
		return visitor.visit(this);
	}

}

Keyboard.java

public class Keyboard extends ComputerElement {

	public Keyboard(double price){
		super(price);
	}
	@Override
	public double accept(ComputerElementVisitor visitor) {
		// TODO Auto-generated method stub
		return visitor.visit(this);
	}

}

WirelessKeyboard.java

public class WirelessKeyboard extends ComputerElement {

	public WirelessKeyboard(double price) {
		// TODO Auto-generated constructor stub
		super(price);
	}
	
	@Override
	public double accept(ComputerElementVisitor visitor) {
		// TODO Auto-generated method stub
		return visitor.visit(this);
	}

}

Mouse.java

public class Mouse extends ComputerElement {

	public Mouse(double price){
		super(price);
	}
	@Override
	public double accept(ComputerElementVisitor visitor) {
		// TODO Auto-generated method stub
		return visitor.visit(this);
	}

}

WirelessMouse.java

public class WirelessMouse extends ComputerElement {

	public WirelessMouse(double price) {
		// TODO Auto-generated constructor stub
		super(price);
	}
	@Override
	public double accept(ComputerElementVisitor visitor) {
		// TODO Auto-generated method stub
		return visitor.visit(this);
	}

}

ComputerAssembly.java

import java.util.ArrayList;

public class ComputerAssembly {
	
	private ArrayList   elements;
	
	public ComputerAssembly(){
		elements = new ArrayList();
	}
	
	public void addElement(ComputerElement element){
		elements.add(element);
	}

	public double calculateDiscountedPrice(ComputerElementVisitor discountVisitor){
		double price = 0;
		
		for (ComputerElement computerElement : elements) {
			price = price + computerElement.accept(discountVisitor);
		}
		
		return price;
	}
}

ComputerElementDiscountVisitor.java

public class ComputerElementDiscountVisitor extends ComputerElementVisitor {

	@Override
	public double visit(CRTMonitor crtMonitor) {
		double discount = 10;
		double crtPrice = crtMonitor.getPrice();
		double discountedPrice = crtPrice - (crtPrice*10/100);
		return discountedPrice;
	}

	@Override
	public double visit(Keyboard keyboard) {
		double discount = 5;
		double keyboardPrice = keyboard.getPrice();
		double discountedPrice = keyboardPrice - (keyboardPrice*10/100);
		return discountedPrice;
	}

	@Override
	public double visit(LCDMonitor lcdMonitor) {
		double discount = 2;
		double lcdMonitorPrice = lcdMonitor.getPrice();
		double discountedPrice = lcdMonitorPrice - (lcdMonitorPrice*10/100);
		return discountedPrice;
	}

	@Override
	public double visit(Mouse mouse) {
		double discount = 5;
		double mousePrice = mouse.getPrice();
		double discountedPrice = mousePrice - (mousePrice*10/100);
		return discountedPrice;
	}

	@Override
	public double visit(WirelessKeyboard wirelessKeyboard) {
		double discount = 1;
		double wirelessKeyboardPrice = wirelessKeyboard.getPrice();
		double discountedPrice = wirelessKeyboardPrice - (wirelessKeyboardPrice*10/100);
		return discountedPrice;
	}

	@Override
	public double visit(WirelessMouse wirelessMouse) {
		double discount = 1;
		double wirelessMousePrice = wirelessMouse.getPrice();
		double discountedPrice = wirelessMousePrice - (wirelessMousePrice*10/100);
		return discountedPrice;
	}

}

VisitorPatternDemo.java

public class VisitorPatternDemo {

	public static void main(String[] args) {

		//Prepare list of Elements in store
		CRTMonitor crtMonitor = new CRTMonitor(5000);
		LCDMonitor lcdMonitor  = new LCDMonitor(10000);
		Keyboard keyboard = new Keyboard(2000);
		WirelessKeyboard wirelesKeyboard = new WirelessKeyboard(3000);
		Mouse mouse  = new Mouse(1000);
		WirelessMouse wMouse  = new WirelessMouse(2500);

		//discount calculator visitor for each element
		ComputerElementVisitor discountVisitor = new ComputerElementDiscountVisitor();

		
		
		//Prepare Computer with LCD and wirelss elements
		System.out.println("---------------------------------------------");
		System.out.println("Prepare Computer with LCD and wirelss elements");
		ComputerAssembly assembly1 = new ComputerAssembly();
		assembly1.addElement(lcdMonitor);
		assembly1.addElement(wMouse);
		assembly1.addElement(wirelesKeyboard);
		System.out.println("applied discount price :"+assembly1.calculateDiscountedPrice(discountVisitor));
		
		
		
		//Prepare Computer with CRT and wirelss elements
		System.out.println("---------------------------------------------");
		System.out.println("Prepare Computer with CRT and wirelss elements");
		ComputerAssembly assembly2 = new ComputerAssembly();
		assembly2.addElement(crtMonitor);
		assembly2.addElement(wMouse);
		assembly2.addElement(wirelesKeyboard);
		System.out.println("applied discount price :"+assembly2.calculateDiscountedPrice(discountVisitor));
		
		//Prepare computer with CRT and wired element
		System.out.println("---------------------------------------------");
		System.out.println("Prepare Computer with CRT and wirelss elements");
		ComputerAssembly assembly3 = new ComputerAssembly();
		assembly3.addElement(crtMonitor);
		assembly3.addElement(mouse);
		assembly3.addElement(keyboard);
		System.out.println("applied discount price :"+assembly3.calculateDiscountedPrice(discountVisitor));
		
	}

}

Output

Leave a comment

Design a site like this with WordPress.com
Get started