工作中很少有自己去写迭代器的情况,但是有必要了解一下迭代器的内部结构。
优点:
简化了遍历方式,对于对象集合的遍历,还是比较麻烦的,对于数组或者有序列表,我们尚可以通过游标来取得,但用户需要在对集合了解很清楚的前提下,自行遍历对象,但是对于hash表来说,用户遍历起来就比较麻烦了。而引入了迭代器方法后,用户用起来就简单的多了。
可以提供多种遍历方式,比如说对有序列表,我们可以根据需要提供正序遍历,倒序遍历两种迭代器,用户用起来只需要得到我们实现好的迭代器,就可以方便的对集合进行遍历了。
封装性良好,用户只需要得到迭代器就可以遍历,而对于遍历算法则不用去关心。
缺点:
- 对于比较简单的遍历(像数组或者有序列表),使用迭代器方式遍历较为繁琐,大家可能都有感觉,像ArrayList,我们宁可愿意使用for循环和get方法来遍历集合。
主要角色:
迭代器角色:一般为接口,主要定义迭代器该有的属性。
具体迭代器角色:主要实现迭代器角色接口的方法。
容器角色:数据容器。
创建迭代器角色:
/**
* 这是一个迭代器接口
* first 游标第一个对象
* next 游标下一个对象
* hasNext 游标是否存在下一个对象
* isFirst 是否是第一个对象
* isLast 是否是最后一个对象
* getCurrentObj 获取当前对象
*/
public interface MyIterator {
void first();
void next();
boolean hasNext();
boolean isFirst();
boolean isLast();
Object getCurrentObj();
}
创建容器角色:
import java.util.ArrayList;
import java.util.List;
/**
* 这是一个容器对象
*/
public class ConcreteAggregate {
private List<Object> list = new ArrayList<Object>();
//数据新增方法
public void addObject(Object object) {
this.list.add(object);
}
//数据删除方法
public void removeObject(Object object) {
this.list.remove(object);
}
//获取list方法
public List<Object> getList() {
return list;
}
//设置list方法
public void setList(List<Object> list) {
this.list = list;
}
}
创建具体迭代器角色:
import java.util.List;
/**
* 这是一个具体迭代器角色
* cursor 定义游标用于记录遍历时的位置
*/
public class ConcreteIterator implements MyIterator {
private List<Object> list;
private int cursor;
public ConcreteIterator(List<Object> list) {
this.list = list;
}
@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);
}
}
测试:
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
/**
* 这是调用者
*/
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ConcreteAggregate aggregate = new ConcreteAggregate();
aggregate.addObject("张三");
aggregate.addObject("李四");
aggregate.addObject("王五");
MyIterator iterator = new ConcreteIterator(aggregate.getList());
while (iterator.hasNext()) {
Log.d("TAG", iterator.getCurrentObj() + "");
iterator.next();
}
}
}
结果:已完成测试!有不对的地方欢迎指出,感恩。