迭代子模式又叫游标模式,是对象的行为模式。迭代子模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象。
一、类图
二、示例
1、结构
1、结构
2、宽接口和窄接口
3、白箱聚集与外禀迭代子
1)结构
1)结构
2)java代码
Aggregate抽象类:
package iterator.whitebox.aggregate;
import iterator.whitebox.iterator.Iterator;
abstract public class Aggregate {
public Iterator createIterator(){
return null;
}
}
abstract public class Aggregate {
public Iterator createIterator(){
return null;
}
}
ConcreteAggregate类:
package iterator.whitebox.aggregate;
import iterator.whitebox.iterator.ConcreteIterator;
import iterator.whitebox.iterator.Iterator;
public class ConcreteAggregate extends Aggregate{
private Object[] objs = {"Monk Tang","Monkey","Pigsy","Sandy","Horse"};
public Iterator createIterator(){
return new ConcreteIterator(this);
}
public Object getElement(int index){
if(index < objs.length){
return objs[index];
}else{
return null;
}
}
public int size(){
return objs.length;
}
}
import iterator.whitebox.iterator.Iterator;
public class ConcreteAggregate extends Aggregate{
private Object[] objs = {"Monk Tang","Monkey","Pigsy","Sandy","Horse"};
public Iterator createIterator(){
return new ConcreteIterator(this);
}
public Object getElement(int index){
if(index < objs.length){
return objs[index];
}else{
return null;
}
}
public int size(){
return objs.length;
}
}
Iterator接口:
package iterator.whitebox.iterator;
public interface Iterator {
public void first();
public void next();
public boolean isDone();
public Object currentItem();
}
public void first();
public void next();
public boolean isDone();
public Object currentItem();
}
ConcreteIterator类:
package iterator.whitebox.iterator;
import iterator.whitebox.aggregate.ConcreteAggregate;
public class ConcreteIterator implements Iterator{
private ConcreteAggregate agg;
private int index=0;
private int size=0;
public ConcreteIterator(ConcreteAggregate agg) {
this.agg = agg;
size = agg.size();
index = 0;
}
public void first(){
index = 0;
}
public void next(){
if(index<size){
index++;
}
}
public boolean isDone(){
return (index>=size);
}
public Object currentItem() {
return agg.getElement(index);
}
}
public class ConcreteIterator implements Iterator{
private ConcreteAggregate agg;
private int index=0;
private int size=0;
public ConcreteIterator(ConcreteAggregate agg) {
this.agg = agg;
size = agg.size();
index = 0;
}
public void first(){
index = 0;
}
public void next(){
if(index<size){
index++;
}
}
public boolean isDone(){
return (index>=size);
}
public Object currentItem() {
return agg.getElement(index);
}
}
Client类:
package iterator.whitebox;
import iterator.whitebox.aggregate.Aggregate;
import iterator.whitebox.aggregate.ConcreteAggregate;
import iterator.whitebox.iterator.Iterator;
public class Client {
private Iterator it;
private Aggregate agg = new ConcreteAggregate();
public void operation(){
it = agg.createIterator();
while(!it.isDone()){
System.out.println(it.currentItem().toString());
it.next();
}
}
public static void main(String[] args){
Client client = new Client();
client.operation();
}
}
import iterator.whitebox.aggregate.ConcreteAggregate;
import iterator.whitebox.iterator.Iterator;
public class Client {
private Iterator it;
private Aggregate agg = new ConcreteAggregate();
public void operation(){
it = agg.createIterator();
while(!it.isDone()){
System.out.println(it.currentItem().toString());
it.next();
}
}
public static void main(String[] args){
Client client = new Client();
client.operation();
}
}
4、黑箱聚集与内禀迭代子
1)结构
一个黑箱聚集不向外部提供遍历自己元素对象的接口,因此,这些元素对象只可以被聚集内部成员访问。由于内禀迭代子恰好是聚集内部的成员子类,因此,内禀迭代子对象是可以访问聚集的元素的。
1)结构
一个黑箱聚集不向外部提供遍历自己元素对象的接口,因此,这些元素对象只可以被聚集内部成员访问。由于内禀迭代子恰好是聚集内部的成员子类,因此,内禀迭代子对象是可以访问聚集的元素的。
2)java代码
Aggregate抽象类:
package iterator.blackbox.aggregate;
import iterator.blackbox.iterator.Iterator;
abstract public class Aggregate {
public abstract Iterator createIterator();
}
abstract public class Aggregate {
public abstract Iterator createIterator();
}
ConcreteAggregate类:
package iterator.blackbox.aggregate;
import iterator.blackbox.iterator.Iterator;
public class ConcreteAggregate extends Aggregate{
private Object[] objs = {"Monk Tang","Monkey","Pigsy","Sandy","Horse"};
public Iterator createIterator(){
return new ConcreteIterator();
}
private class ConcreteIterator implements Iterator{
private int currentIndex = 0;
public class ConcreteAggregate extends Aggregate{
private Object[] objs = {"Monk Tang","Monkey","Pigsy","Sandy","Horse"};
public Iterator createIterator(){
return new ConcreteIterator();
}
private class ConcreteIterator implements Iterator{
private int currentIndex = 0;
public Object currentItem() {
return objs[currentIndex];
}
return objs[currentIndex];
}
public void first() {
currentIndex = 0;
}
currentIndex = 0;
}
public boolean isDone() {
return (currentIndex==objs.length);
}
return (currentIndex==objs.length);
}
public void next() {
if(currentIndex < objs.length){
currentIndex++;
}
}
}
}
if(currentIndex < objs.length){
currentIndex++;
}
}
}
}
Iterator接口:
package iterator.blackbox.iterator;
public interface Iterator {
public void first();
public void next();
public boolean isDone();
public Object currentItem();
}
public void first();
public void next();
public boolean isDone();
public Object currentItem();
}
Client类:
package iterator.blackbox;
import iterator.blackbox.aggregate.Aggregate;
import iterator.blackbox.aggregate.ConcreteAggregate;
import iterator.blackbox.iterator.Iterator;
public class Client {
private Iterator it;
private Aggregate agg = new ConcreteAggregate();
public void operation(){
it = (Iterator) agg.createIterator();
while(!it.isDone()){
System.out.println(it.currentItem().toString());
it.next();
}
}
public static void main(String[] args){
Client client = new Client();
client.operation();
}
}
import iterator.blackbox.aggregate.ConcreteAggregate;
import iterator.blackbox.iterator.Iterator;
public class Client {
private Iterator it;
private Aggregate agg = new ConcreteAggregate();
public void operation(){
it = (Iterator) agg.createIterator();
while(!it.isDone()){
System.out.println(it.currentItem().toString());
it.next();
}
}
public static void main(String[] args){
Client client = new Client();
client.operation();
}
}