迭代器模式场景

  • 提供一种可以遍历聚合对象的方式。又称为:游标cursor模式
  •  聚合对象:存储数据
  • 迭代器:遍历数据


迭代器模式结构

  • 聚合对象:存储数据
  • 迭代器:遍历数据



自定义的迭代器接口:IMyIterator.java

package 设计模式.迭代器模式;

/**
* 自定义的迭代器接口
*
* @author 陈霓清
*/
public interface IMyIterator {
// 将游标指向第一个元素
void first();

// 将游标指向下一个元素
void next();

// 判断是否存在下一个元素
boolean hasNext();

boolean isFirst();
boolean isLast();

// 获取当前游标指向的对象
Object getCurrentObj();
}


自定义的聚合类:ConcreteMyAggregate.java

package 设计模式.迭代器模式;

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

/**
* 自定义的聚合类
*
* @author 陈霓清
*/
public class ConcreteMyAggregate {
private List<Object> list = new ArrayList<Object>();

public void addObject(Object obj){
this.list.add(obj);
}
public void removeObject(Object obj){
this.list.remove(obj);
}
public List<Object> getList() {
return list;
}
public void setList(List<Object> list) {
this.list = list;
}

// 获得迭代器
public IMyIterator createIterator(){
return new ConcreteIterator();
}

/**
* 使用内部类定义迭代器,可以直接使用外部类的属性
*
* @author 陈霓清
*/
private class ConcreteIterator implements IMyIterator {

private int cursor; // 定义游标用于记录遍历时的位置

@Override
public void first() {
cursor = 0;
}

@Override
public void next() {
if (cursor<list.size()) {
cursor++;
}
}

@Override
public boolean hasNext() {
if (cursor<list.size()) {
return true;
}
return false;
}

@Override
public boolean isFirst() {
return cursor==0?true:false;
}

@Override
public boolean isLast() {
return cursor==(list.size()-1)?true:false;
}

@Override
public Object getCurrentObj() {
return list.get(cursor);
}
}

}

客户端调用:Client.java

package 设计模式.迭代器模式;

public class Client {

public static void main(String[] args) {
ConcreteMyAggregate cma = new ConcreteMyAggregate();
cma.addObject("aa");
cma.addObject("bb");
cma.addObject("cc");

IMyIterator iter = cma.createIterator();
while (iter.hasNext()) {
System.out.println(iter.getCurrentObj());
iter.next();
}

}

}



回到顶部