迭代器模式又称游标模式, 是行为型设计模式之一。迭代器模式源于对容器的访问,比如Java中的List、Map、数组等。
对容器对象的访问必然会涉及到遍历算法,可以将遍历算法封装在容器中,或者不提供遍历算法。如果将遍历算法封装在容器中,那么容器类就承担了过多的功能,容器类不仅要维护自身内部的数据元素,而且还要对外提供遍历的接口方法,因为遍历状态的存储问题还不能对同一个容器同时进行多个遍历操作,如果我们不提供遍历方法而让使用者自己去实现,又会让容器的内部细节暴露无遗,正因为此,迭代器模式应运而生,在客户访问类和容器体之间插入一个中间者——迭代器。
迭代器模式的定义
提供一种方法顺序访问一个容器对象中的各个元素,而又不需要暴露该对象的内部表示。
迭代器模式的使用场景
遍历一个容器对象使。
迭代器模式的UML图
角色介绍
Iterator:迭代器接口
迭代器接口负责定义、访问和遍历元素的接口。
Concrete Iterator:具体迭代器类
具体迭代器类的目的主要是实现迭代器接口,并记录遍历的当前位置。
Aggreate:容器接口
容器接口负责提供创建具体迭代器角色的接口
Concrete Aggregate:具体容器类
具体迭代器角色与该容器相互关联
Client:客户类
迭代器模式简单Demo
package iterator.gome.com.iteratordemo;
public interface Iterator<T> {
/**
*
* @return true 表示有,false表示没有
*/
boolean hasNext();
/**
*
* @return 返回当前位置的元素并将位置移至下一位
*/
T next();
}
package iterator.gome.com.iteratordemo;
import java.util.ArrayList;
import java.util.List;
public class ConcreteIterator<T> implements Iterator<T> {
private List<T> list = new ArrayList<T>();
private int cursor = 0;
public ConcreteIterator(List<T> list) {
this.list = list;
}
@Override
public boolean hasNext() {
return cursor != list.size();
}
@Override
public T next() {
T obj = null;
if (this.hasNext()) {
obj = this.list.get(cursor++);
}
return obj;
}
}
package iterator.gome.com.iteratordemo;
public interface Aggregate<T> {
/**
* 添加一个元素
* @param obj
*/
void add(T obj);
/**
* 移除一个元素
* @param obj
*/
void remove(T obj);
/**
* 获取容器迭代器
* @return 返回迭代器对象
*/
Iterator<T> iterator();
}
package iterator.gome.com.iteratordemo;
import java.util.ArrayList;
import java.util.List;
public class ConcreteAggregate<T> implements Aggregate<T> {
private List<T> list = new ArrayList<T>();
@Override
public void add(T obj) {
list.add(obj);
}
@Override
public void remove(T obj) {
list.remove(obj);
}
@Override
public Iterator<T> iterator() {
return new ConcreteIterator<T>(list);
}
}
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Aggregate<String> a = new ConcreteAggregate<String>();
a.add("Aige");
a.add("Studio \n");
a.add("OK");
a.add(" Brother");
Iterator<String> i = a.iterator();
while(i.hasNext()) {
Log.v("zy_itagrator", i.next() + "");
}
}
}
Log分析:
V/zy_itagrator: Aige
V/zy_itagrator: Studio
V/zy_itagrator: OK
V/zy_itagrator: Brother
迭代器模式对于开发者来说几乎不会自己去实现一个迭代器,就拿Android来说,其除了各种数据结构体,如List、Map等所包的迭代器外,Android自身源码中也为我们提供了迭代器遍历数据,最为典型的就是数据库查询使用的Cursor,当我们使用SQLiteDatabase的query方法查询数据库时,会返回一个Cursor游标对象,该游标对象实质上是一个具体的迭代器,我们可以使用它来遍历数据库查询所得到的结果集。
参考《Android源码设计模式》