设计模式-迭代器模式

来源:互联网 发布:php源码修改工具 编辑:程序博客网 时间:2024/05/18 02:09

1.迭代器模式的定义及使用场景

定义:

迭代器模式又称游标模式,是行为型设计模式之一。其源于对容器的访问,比较java的List、Map、数组等。如果将容器遍历的方法封装在容器中,容器类不仅要维护自身内部的数据元素而且还要对外提供遍历的接口方法,如果不提供遍历的方法而让使用者自己去实现,又会让容器的内部细节暴露。正因于此,迭代模式应运而生。
迭代器模式提供一种方法顺序访问一个容器对象的各个元素,而又不需要暴露该对象的内部表示

使用场景:

遍历一个容器对象
重点内容
这里写图片描述

2. 迭代器模式的优缺点

2.1优点

可以遍历容器而又不暴露该对象的内部表示,弱化了容器类和遍历算法之间的关系

2.2缺点

增加类文件

3.注意事项

3.1使用for循环与使用迭代器iterator的对比

效率上的各有有事
采用ArrayList对随机访问比较快,而for循环中的get()方法,采用的即是随机访问的方法,因此在ArrayList里,for循环较快
采用LinkedList则是顺序访问比较快,iterator中的next()方法,采用的即是顺序访问的方法,因此在LinkedList里,使用iterator较快
从数据结构角度分析,for循环适合访问顺序结构,可以根据下标快速获取指定元素.而Iterator 适合访问链式结构,因为迭代器是通过next()和Pre()来定位的.可以访问没有顺序的集合.
而使用 Iterator 的好处在于可以使用相同方式去遍历集合中元素,而不用考虑集合类的内部实现(只要它实现了 java.lang.Iterable 接口),如果使用 Iterator 来遍历集合中元素,一旦不再使用 List 转而使用 Set 来组织数据,那遍历元素的代码不用做任何修改,如果使用 for 来遍历,那所有遍历此集合的算法都得做相应调整,因为List有序,Set无序,结构不同,他们的访问算法也不一样.

3.2foreach和Iterator的关系

for each是jdk5.0新增加的一个循环结构,可以用来处理集合中的每个元素而不用考虑集合定下标。
格式如下
for(variable:collection){ statement; }
定义一个变量用于暂存集合中的每一个元素,并执行相应的语句(块)。collection必须是一个数组或者是一个实现了lterable接口的类对象。 使用for each循环语句的优势在于更加简洁,更不容易出错,不必关心下标的起始值和终止值

4. 迭代器模式的实现方式

public interface Iterator {    public  Object next();    public boolean hasNext();    public  boolean remove();}
public class ConcreteIteractor implements  Iterator {    private  Vector vevcor=new Vector<>();    private int curosr=0;    public ConcreteIteractor(Vector vevcor) {        this.vevcor = vevcor;    }    @Override    public Object next() {        Object result=null;        if(this.hasNext()){            result=this.vevcor.get(this.curosr++);        }else{            result=null;        }        return result;    }    @Override    public boolean hasNext() {        if(this.curosr==this.vevcor.size()){            curosr=0;            return  false;        }else{            return true;        }    }    @Override    public boolean remove() {        this.vevcor.remove(this.curosr);        return true;    }}
public interface Aggregate {    public void add(Object object);    public void remove(Object remove);    public Iterator iterator();}
public class ConcreteAggragate implements Aggregate {    private Vector vevcor = new Vector<>();    @Override    public void add(Object object) {        this.vevcor.add(object);    }    @Override    public void remove(Object remove) {        this.vevcor.remove(remove);    }    @Override    public Iterator iterator() {        return new ConcreteIteractor(vevcor);    }}

5. 迭代器模式在Android中的实际应用

迭代器这个模式对开发者来说几乎不会自己去实现一个迭代器,Android中,其除了各种数据结构体,如List、Map等所包含的迭代器外,Android自身源码中也为我们提供了迭代器遍历数据。最为典型的例子就是Cursor游标对象,该游标对象实质就是一个具体的迭代器,我们可以使用它来遍历数据库查询所得的结果集。

1 0
原创粉丝点击