Sunday, October 4, 2009

Design Pattern in Brief (4)

Iterator

Iterator digunakan untuk mengakses isi sebuah container secara urut tanpa harus mengetahui isi container tersebut. Container yang dimaksud adalah collection of data. Di java, Iterator dapat diterapkan dengan implement java.util.Iterator. Ada dua macam iterator yaitu internal dan eksternal.

Misalkan kita memiliki sebuah container, maka internal iterator adalah iterator yang dimaintain oleh container tersebut. Container bertanggung jawab terhadap state dari iterator dan hanya bisa ada satu iterator dalam satu container. Sedangkan eksternal iterator adalah iterator yang diletakkan dalam object terpisah dari container. Jadi sekarang ada dua object, container dan iterator, di mana container mengembalikan sebuah object bertipe iterator dalam sebuah methodnya, misalnya getIterator().

Berikut adalah contoh internal iterator :
package edu.mat.pattern.iterator;

import java.util.Enumeration;
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.Vector;

/**
* Internal Iterator means the collection itself needs to maintain the iterator,
* that's why this collection extends Iterator. So this class can be viewed as both
* a container and an iterator.
* */
public class InternalIterator implements Iterator {

private Vector data;
private Enumeration enumeration;
private Employee nextEmployee;

public InternalIterator() {
data = new Vector();
data.add(new Employee("Santoso", "Los Angeles"));
data.add(new Employee("Rochmat", "New York"));

enumeration = data.elements();
}

@Override
public boolean hasNext() {
nextEmployee = null;
while(enumeration.hasMoreElements()) {
Employee employee = enumeration.nextElement();
nextEmployee = employee;
if(employee != null)
return true;
}
return false;
}

@Override
public Employee next() {
if(nextEmployee == null)
throw new NoSuchElementException();
else
return nextEmployee;
}

@Override
public void remove() {
// do nothing because we don't wanna remove anything

}

}

Dan berikut adalah contoh eksternal iterator yang terdiri dari container dan iterator :
package edu.mat.pattern.iterator;

import java.util.Enumeration;
import java.util.Iterator;
import java.util.Vector;

public class ExternalContainer {

private Vector data;

public ExternalContainer() {
data = new Vector();
data.add(new Employee("Santoso", "Los Angeles"));
data.add(new Employee("Rochmat", "New York"));
}

public Enumeration getAllEmployees() {
return data.elements();
}

public Iterator getEmployeeByName(String name) {
return new ExternalIterator(this, name);
}

}

package edu.mat.pattern.iterator;

import java.util.Enumeration;
import java.util.Iterator;
import java.util.NoSuchElementException;

public class ExternalIterator implements Iterator {

private String name;
private Enumeration enumeration;
private Employee nextEmployee;

public ExternalIterator(ExternalContainer employees, String name) {
this.name = name;
this.enumeration = employees.getAllEmployees();
}

@Override
public boolean hasNext() {
nextEmployee = null;
while(enumeration.hasMoreElements()) {
Employee employee = enumeration.nextElement();
nextEmployee = employee;
if(employee != null) {
if(name == null)
return true; // jika tidak ada filter maka return true
else {
if(employee.getName() != null) {
if(name.equals(employee.getName()))
return true; // jika ada filter dan curr employee name sama maka return true
// jika ada filter tapi curr employee name tdk sama maka continue
} // jika ada filter tapi curr employee name null maka continue
}
}
}
return false; // jika next employee = null maka return false
}

@Override
public Employee next() {
if(nextEmployee == null)
throw new NoSuchElementException();
else
return nextEmployee;
}

@Override
public void remove() {
// do nothing because we don't wanna remove anything

}

}

1 comments:

joni said...

mau numpang nanya..
di java kan udah ada yang namanya java.util.iterator
jadi penerapan iterator pattern itu udah ga berguna dong ya?
kalo misal masih ada guna nya, dibagian mananya mas yang?
setau saya kalo iterator [attern itu kan kita membuat interface iterator baru bukan hanya tinggal memakai java.util.iterator..

tolong ditanggapi..terima kasih..

 

©2009 Stay the Same | by TNB