Sunday, October 11, 2009

Design Pattern in Brief (6)

Visitor

Untuk memahami visitor perhatikan contoh berikut : Misal kita memiliki list of order yang bisa kita kategorikan menjadi tiga yaitu California order, Non California order, dan Overseas order. Saat mengiterasi list tersebut, untuk masing-masing order kita ingin menjalankan sebuah method, misalkan accept(), namun method accept ini akan melakukan hal-hal yang berbeda tergantung jenis ordernya. Bagaimana kita melakukan hal ini? Inilah yang coba dipecahkan pattern visitor.

Untuk mengimplementasikannya kita akan membuat sebuah interface IOrder yang berisi sebuah method yang sama, accept(IVisitor visitor) yang akan dieksekusi lewat list. Selanjutnya kita membuat tiga class, masing-masing untuk order yang berbeda.

Untuk visitornya, kita membuat sebuah interface, IVisitor, yang memiliki tiga method visit() dengan parameter yang berbeda, masing-masing untuk tiap order. Kemudian kita akan mengimplementasikan IVisitor dalam sebuah class VisitorImpl yang akan mengimplementasikan masing-masing method visit() tersebut.

Kita bisa merangkum class-class yang terlibat dalam diagram berikut :







Dan berikut adalah codenya :

package edu.mat.pattern;

public interface IOrder {

public void accept(IVisitor visitor);
}

package edu.mat.pattern;

public class OrderCalifornia implements IOrder {

private String message;

@Override
public void accept(IVisitor visitor) {
visitor.visit(this);
}

public String getMessage() {
if(message == null)
message = "Order California";
return message;
}

public void setMessage(String message) {
this.message = message;
}

}

package edu.mat.pattern;

public class OrderNonCalifornia implements IOrder {

private String state;

@Override
public void accept(IVisitor visitor) {
visitor.visit(this);
}

public String getState() {
if(state == null)
state = "New York";
return state;
}

public void setState(String state) {
this.state = state;
}

}

package edu.mat.pattern;

public class OrderOverseas implements IOrder {

private String destinationCountry;

@Override
public void accept(IVisitor visitor) {
visitor.visit(this);
}

public String getDestinationCountry() {
if(destinationCountry == null)
destinationCountry = "Indonesia";
return destinationCountry;
}

public void setDestinationCountry(String destinationCountry) {
this.destinationCountry = destinationCountry;
}

}

package edu.mat.pattern;

public interface IVisitor {

public void visit(OrderCalifornia orderCalifornia);
public void visit(OrderNonCalifornia orderNonCalifornia);
public void visit(OrderOverseas orderOverseas);
}

package edu.mat.pattern;

public class VisitorImpl implements IVisitor {

@Override
public void visit(OrderCalifornia orderCalifornia) {
System.out.println(orderCalifornia.getMessage());
}

@Override
public void visit(OrderNonCalifornia orderNonCalifornia) {
System.out.println(orderNonCalifornia.getState());
}

@Override
public void visit(OrderOverseas orderOverseas) {
System.out.println(orderOverseas.getDestinationCountry());
}

}

package edu.mat.pattern;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Main {

public static void main(String[] args) {
IVisitor visitor = new VisitorImpl();
List orders = new ArrayList();
orders.add(new OrderCalifornia());
orders.add(new OrderNonCalifornia());
orders.add(new OrderOverseas());

Iterator iter = orders.iterator();
while(iter.hasNext()) {
iter.next().accept(visitor);
}
}
}

0 comments:

 

©2009 Stay the Same | by TNB