定义
迭代器模式提供一种方法,顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
解决的问题
让客户遍历你的对象而又无法窥视你存储对象的方式,也就是说封装集合的遍历方式并对外提供。
也就是让不同集合(List Map int[] set等)元素的访问方式,在某一个点上形成统一,这样使用者就不用具体关心是哪个集合类,只需要调用这个统一的访问方式就行了。
类图
![](https://img.haomeiwen.com/i10820743/d40b0608abaf10cd.png)
伪代码
public interface Iterator{
public boolean hasNext();
public Obj next();
}
public interface SuperClass{
public Iterator createIterator();
}
public class Obj1Iterator implements{
public Obj[] arrs;
private int position = 0;
public Obj1Iterator(Obj[] arrs){
this.arrs = arrs;
}
public boolean hasNext(){
if(position>=arrs.length) return false
if(arrs[position] == null) return false
return true;
}
public Obj next(){
Obj obj = arrs[position];
position ++;
return obj;
}
}
public class Obj2Iterator implements{
public List<Obj> list;
private int position = 0;
public Obj1Iterator(List<Obj> list;){
this.list = list;
}
public boolean hasNext(){
if(position>=list.size()) return false
if(list.get(position) == null) return false
return true;
}
public Obj next(){
Obj obj = list.get(position);
position ++;
return obj;
}
}
public class Obj1 implements SuperClass{
private Obj[] arrs;
public Obj1(){
arrs = new Obj[3];
arrs[0] = new Obj(name0);
arrs[1] = new Obj(name1);
arrs[2] = new Obj(name2);
}
public Iterator createIterator(){
return new Obj1Iterator(arrs);
}
}
示例:
public class Client{
SuperClass obj1,obj2;
public Client(obj1,obj2){
this.obj1 = obj1;
this.obj2 = obj2;
}
public void method(){
Iterator i1 = obj1.createIterator();
Iterator i2 = obj2.createIterator();
print(i1);
print(i2);
}
public void print(Iterator it){
while(it.hasNext()){
print (it.next().name);
}
}
}
描述
- 一个是数组,一个是集合,二者访问元素的方式不同。
- 两个类的Iterator实现了同一个Iterator,在访问元素的方式上形成统一。
- 两个类都实现类SuperClass,在createIterator的方式上形成统一。
- 在Client的print中,只关心Iterator是什么,不用关系具体是数组还是集合。都是一样的访问方式。
临时感想
- 你想要的是什么
- 变化的是什么
网友评论