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
