目录
1. 迭代器模式的定义
提供一种方法顺序访问一个容器中的各个对象,而又不需要暴露对象的内部表示
2. 迭代器模式的使用场景
遍历一个容器对象时
3. UML图与实例代码
实例代码
public class IteratorPattern {
public static void main(String[] args) {
Aggregate aggregate = new ConcreteAggregate();
aggregate.add("小明");
aggregate.add("小红");
aggregate.add("小刚");
Iterator iterator = aggregate.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
// 容器
interface Aggregate {
public void add(Object object);
public void remove(Object object);
public Iterator iterator();
}
class ConcreteAggregate implements Aggregate {
private List<Object> list = new ArrayList<>();
@Override
public void add(Object object) {
list.add(object);
}
@Override
public void remove(Object object) {
list.remove(object);
}
@Override
public Iterator iterator() {
return new ConIterator(list);
}
}
interface Iterator<T> {
T next();
T first();
boolean hasNext();
}
// 具体的迭代器
class ConIterator implements Iterator {
private List<Object> list = null;
private int index = -1;
public ConIterator(List<Object> list) {
this.list = list;
}
@Override
public Object next() {
Object object = null;
if (this.hasNext()) {
object = list.get(++index);
}
return object;
}
@Override
public Object first() {
index = 0;
Object object = list.get(index);
return object;
}
@Override
public boolean hasNext() {
if (index + 1 < list.size()) {
return true;
}
return false;
}
}
迭代器的使用
Iterator iterator = aggregate.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
迭代器的使用一般都是这种形式,我们不需要知道aggregate中数据结构是怎么样的,只需要获取它的迭代器,并且通过接口就可以遍历对象了。
总的来说,迭代器一般会有这几个接口,hasNext、next、remove,而迭代器数据的来源由具体需要被遍历的对象给出,一般通过构造方法传入迭代器,或者直接在内部实现迭代器,而迭代器的作用主要是:输出一个数据,并且把指针移向下一个数据,判断数据是否已经遍历完成,删除其中一个数据。迭代器对数据的操作是单个进行的。
4. 迭代器模式在Android中的应用
Cursor cursor = db.query("user", new String[]{"name"}, null, null, null, null, null);
String textview_data = "";
while(cursor.moveToNext()){
String name = cursor.getString(cursor.getColumnIndex("name"));
}
相信大家都用过Sqlite数据库,原生的请求方式如上,这里的Cursor就相当于Iterator,db是database,也就是具体需要被迭代的对象。