基本要点
场景:提供一种可以遍历聚合对象的方式,又称游标模式cursor,例如JDK内部迭代器
聚合对象:存储数据
迭代器:遍历数据
代码样例
我们可以自己写一个迭代器
首先定义一个迭代器接口
/**
* 自定义迭代接口
*/
public interface MyIterator {
// 将游标指向第一个元素
void first();
// 将游标指向最后一个元素
void last();
// 判断是否存在下一个元素
boolean hasNext();
// 判断是否是第一个元素
boolean isFirst();
// 判断是否存是最后一个元素
boolean isLast();
// 获取当前游标指向的对象
Object getCurrentObject();
// 将游标指向下一个
void next();
}
然后我们自定义一个聚合对象,用于存放数据,并且我们将迭代器定义为它的内部类,这样迭代器就可以直接使用外部类的属性
import java.util.ArrayList;
import java.util.List;
/**
* 自定义聚合类
*/
public class ConcreteMyAggregate {
private List<Object> list = new ArrayList<>();
public void add(Object obj) {
list.add(obj);
}
public void remove(Object obj) {
list.remove(obj);
}
public List<Object> getList() {
return list;
}
public void setList(List<Object> list) {
this.list = list;
}
// 获得迭代器
public MyIterator createIterator() {
return new ConcreteIterator();
}
/**
* 使用内部类定义迭代器,可以直接使用外部类的属性
*/
private class ConcreteIterator implements MyIterator {
// 定义游标,用于记录遍历时的位置
private int cursor;
@Override
public void first() {
cursor = 0;
}
@Override
public void last() {
cursor = list.size() - 1;
}
@Override
public boolean hasNext() {
return cursor < list.size();
}
@Override
public boolean isFirst() {
return cursor == 0;
}
@Override
public boolean isLast() {
return cursor == list.size() - 1;
}
@Override
public Object getCurrentObject() {
return list.get(cursor);
}
@Override
public void next() {
if (cursor < list.size()) {
cursor ++;
}
}
}
}
然后我们在客户端进行测试
public class Client {
public static void main(String[] args) {
ConcreteMyAggregate myAggregate = new ConcreteMyAggregate();
myAggregate.add("aa");
myAggregate.add("bb");
myAggregate.add("cc");
MyIterator iterator = myAggregate.createIterator();
while (iterator.hasNext()) {
System.out.println(iterator.getCurrentObject());
iterator.next();
}
}
}
运行结果如图
如有错误,欢迎指正
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/136809.html