Android设计模式之迭代器模式

本文深入讲解迭代器模式,探讨其如何解决容器遍历的问题,通过示例代码展示具体实现过程,解析迭代器模式在Android中的应用,如Cursor的使用。

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

迭代器模式又称游标模式, 是行为型设计模式之一。迭代器模式源于对容器的访问,比如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源码设计模式》

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值