Iterator

Pattern descritto in Design Pattern.

Lo scopo del pattern Iterator é quello di fornire una di accesso sequenziale agli elementi di un oggetto aggregato senza esporre la rappresentazione interna.

Esempio

L'interfaccia Iterator disponibile in Java, java.util.Iterator, é leggermente diversa da quella proposta dalla Gang of Four, in particolare prevede anche un metodo per rimuovere l'elemento corrente dalla collezione sottostante. Usiamo comunque quella nel nostro esempio.

Il problema del nostro mondo fantasy che utilizziamo per il nostro esempio é quello di implementare una classe che descrive un tipo peculiare di personaggi che posseggono mezza dozzina di mostri al loro servizio. Questa implementazione prevede che i mostri siano esattamente sei, vengono creati assieme al personaggio ed esistono solo in quanto appartenenti al personaggio stesso.

Per questo motivo li implementiamo con un array e li rendiamo disponibili all'utente della classe per mezzo di un iteratore.

Questo é il codice relativo alla nostra classe Monster, in una implementazione minimale:

package gof.iterator;

public class Monster {
private final int number;
private boolean active = true;

public Monster(int number) {
this.number = number;
}

public int getNumber() {
return number;
}

public boolean isActive() {
return active;
}

public void setActive(boolean active) {
this.active = active;
}
}

La classe che rappresenta il padrone dei mostri viene in questo modo modo:

package gof.iterator;

import java.util.Iterator;

public class MonsterMaster {
private final String name;
private Monster[] monsters = new Monster[6];

public MonsterMaster(String name) {
this.name = name;

for(int i = 0; i < 6; ++i)
monsters[i] = new Monster(i + 1);
}

public String getName() {
return name;
}

public Iterator getIterator() {
return new MonsterIterator(monsters);
}
}

E questa é l'implementazione per il nostro iteratore, che usa come collezione sottostante un array di mostri, come richiesto:

package gof.iterator;

import java.util.Iterator;

public class MonsterIterator implements Iterator {
private Monster[] monsters;
private int current = 0;

public MonsterIterator(Monster[] monsters) {
this.monsters = monsters;
}

public boolean hasNext() {
if(current == monsters.length)
return false;
return true;
}

public Object next() {
if(current == monsters.length)
return null;

return monsters[current++];
}

public void remove() {
monsters[current].setActive(false);
}
}

Verifichiamo la nostra implementazione con questa funzione:

public static void main(String[] args) {
MonsterMaster master = new MonsterMaster("MoMa");

Iterator it = master.getIterator();

System.out.println("List of monsters for " + master.getName());
while(it.hasNext()) {
Monster m = it.next();

System.out.print(m.getNumber() + " ");
}
System.out.println();
}

Nessun commento:

Posta un commento