设计模式14——迭代器模式

迭代器模式是一种设计模式,它提供了一种方法来访问聚合对象的元素,同时不暴露其内部表示。此模式允许遍历不同的集合结构,并提供统一的接口。然而,遍历期间修改集合可能会导致异常。在Java中,如List的Iterator和Map的EntryIterator是迭代器模式的实例。在Android中,Cursor用于数据库查询,作为迭代器遍历查询结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、迭代器的定义 

Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.(它提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节。)

二、迭代器模式的应用
1、迭代器模式的优点

迭代器模式使得访问一个聚合对象的内容而无需暴露它的内部表示,即迭代抽象。

迭代器模式为遍历不同的集合结构提供了一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作

2、迭代器模式的缺点 

迭代器模式在遍历的同时更改迭代器所在的集合结构会导致出现异常。所以使用foreach语句只能在对集合进行遍历,不能在遍历的同时更改集合中的元素。

3.迭代器模式的使用场景。

  1、访问一个聚合对象的内容而无须暴露它的内部表示。

  2、需要为聚合对象提供多种遍历方式。

  3、为遍历不同的聚合结构提供一个统一的接口

三、迭代器模式的实现

/**
 * 迭代器的抽象类
 *
 */
public interface Iterator<E> {
    //遍历下一个元素
    public E next();
    //是否还有下一个元素
    public boolean hasNext();
    //删除当前指向的元素
    public boolean remove();
}


/**
 * 自己实现的迭代器
 */
public class MyItrator<E> implements Iterator<E> {

    private List<E> list=new ArrayList<E>();

    private int cursor=0;

    public MyItrator(List<E> e) {
        this.list=e;
    }

    @Override
    public E next() {
        E e=null;
        if(this.hasNext()){
            e=this.list.get(this.cursor++);
        }else{
            e=null;
        }
        return e;
    }

    @Override
    public boolean hasNext() {
        if(this.cursor==this.list.size()){
            return false;
        }else{
            return true;
        }
    }

    /**
     * 开发系统时,迭代器的删除方法应该完成两个逻辑:一是删除当前元素,二是当前游标指向下一个元素
     */
    @Override
    public boolean remove() {
        list.remove(cursor);
        cursor++;
        return true;
    }


}



/**
 * 集合接口
 */
public interface  Aggregate<E> {
    public void add(E object);
    public void remove(E object);
    public  Iterator iterator();
}



/**
 * 自定义集合
 */

public class MyConnection<E> implements Aggregate<E>{
    private List<E> a=new ArrayList<E>();

    @Override
    public void add(E object) {
        a.add(object);
    }

    @Override
    public void remove(E object) {
        a.remove(object);
    }

    @Override
    public Iterator iterator() {

        return new MyItrator<E>(this.a);
    }


}

public class ClientTest {


    public static void main(String[] args) {
        MyConnection<String> st=new MyConnection<String>();
        st.add("111");
        st.add("222");
        st.add("333");
        st.add("444");
        Iterator iterator=st.iterator();
        while (iterator.hasNext()) {
                String aString=(String) iterator.next();
                System.out.println("ClientTest.main()"+aString);

        }

    }

四、 迭代器模式在源码中的应用

比如说List中的Iterator,Map中的EntryIterator等。在Android 中典型的迭代器模式例子是数据库查询使用 Cursor,当我们使用 SQLiteDatabase 的 query 方法查询数据时,会返回一个 Cursor 游标对象,该游标对象实质就是一个具体的迭代器,我们可以使用它遍历数据库查询所得到的结果集。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值