概念:
迭代器模式就是顺序访问聚集中的对象,一般来说,集合中非常常见。这句话包含两层意思:一是需要遍历的对象,即聚集对象,二是迭代器对象,用于对聚集对象进行遍历访问。
贴段查询数据库的代码:
询数据库均会把查询的结果包装在一个Cursor的子类对象中返回。Cursor就像是位于结果聚集之上的一个游标,可以对结果集进行向前、向后或随 机的访问。这就是一种迭代模式
Cursor lanCursor = mDbHelper.findList(false, "language_id",
new String[] { "LanguageID" }, "CountryID = '" + CountryID
+ "'", null, null, null, null, null);
if (lanCursor != null && lanCursor.moveToNext()) {
String LanguageIDT = lanCursor.getString(lanCursor
.getColumnIndexOrThrow("LanguageID"));
strReturn = LanguageIDT;
// strReturn = lanid.get(LanguageIDT) == null ? "1" : lanid
// .get(LanguageIDT);
}
if (lanCursor != null) {
lanCursor.close();
}
来看一下迭代器模式类图:
下面看自己怎么去实现在集合迭代:
先创建一个迭代接口:
public interface Iterator {
public Object previous();
public Object next();
public boolean hasNext();
public Object first();
}
创建一个集合接口:里面需要定义一个方法,返回类型为上面的迭代接口
public interface Collection { public Iterator iterator(); public int size(); public Object get(int pos); public Collection add(Object o); }
再写这两个接口的实现类:
CityList 内部持有一个List 存放城市名
public class CityList implements Collection {
private List<String> website = new ArrayList<String>();
public CityList(List<String> website) {
this.website = website;
}
@Override
public Collection add(Object o) {
if (null != website) {
website.add((String) o);
}
return this;
}
@Override
public Iterator iterator() {
return new IteratorImplement(this);
}
@Override
public int size() {
return null == website ? 0 : website.size();
}
@Override
public Object get(int pos) {
return website.get(pos);
}
}
迭代接口的实现类:内部持有一个Collection对象
public class IteratorImplement implements Iterator { private int pos = -1; private Collection collection; public IteratorImplement(Collection collection) { this.collection = collection; } @Override public Object previous() { pos--; return (null == collection || pos < 0 || pos >= collection.size()) ? null : collection.get(pos); } @Override public Object next() { pos++; return (null == collection || pos < 0 || pos >= collection.size()) ? null : collection.get(pos); } @Override public boolean hasNext() { return (null == collection || pos < -1 || pos >= collection.size() - 1) ? false : true; } @Override public Object first() { pos = 0; return (null == collection || pos < 0 || pos >= collection.size()) ? null : collection.get(pos); } }
测试类:
public class WorkClass { public void test() { List<String> list= new ArrayList<String>(); list.add("beijing"); list.add("shanghai"); Collection collection = new CityList(list).add("guangzhou").add("shenzhen"); Iterator iterator = collection.iterator(); while (iterator.hasNext()){ System.out.println(iterator.next()); } } }
输出结果:
01-29 06:39:47.740 6038-6038/com.example.qinghua_liu.myapplication I/System.out: beijing 01-29 06:39:47.740 6038-6038/com.example.qinghua_liu.myapplication I/System.out: shanghai 01-29 06:39:47.740 6038-6038/com.example.qinghua_liu.myapplication I/System.out: guangzhou 01-29 06:39:47.740 6038-6038/com.example.qinghua_liu.myapplication I/System.out: shenzhen 01-29 06:39:47.740 6038-6038/com.example.qinghua_liu.myapplication E/MainActivity2: qinghua item3 clicked
实现了对CityList聚集内部的遍历访问,其实Android 源码各个功能类也都是这些基本的东西,一些基本设计模式思想,
或者某几个模式的思想都有体现,再进行一些优化。