【设计模式与Android】迭代器模式——容器遍历,细节隐藏

什么是迭代器模式

所谓迭代器模式,就是提供一种方法顺序访问一个容器对象的各个元素,而又不需要暴露该对象的内部表示的设计模式。

迭代器模式的实现方式

 

在客户访问类与容器体之间插入一个第三者——迭代器,就可以在不暴露该对象的内部表示的同时解决容器类承担提供遍历方法功能造成功能冗余的问题。

《水浒传》中“梁山泊全伙受招安”的时候,宋江给梁上好汉造了天罡地煞两个花名册(容器)。先定义一个容器接口:


public interface Company {

Iterator iterator();

}

天罡容器:


public class SkyCompany implements Company {

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

public SkyCompany() {
        list.add(new Bawcock("宋江","呼保义","天魁星","兵马大元帅"));
        //此处省略34行代码
        list.add(new Bawcock("燕青","浪子","天巧星","步军统领兼谍报队长"));
    }

public List<Bawcock> getList(){
        return list;
    }

@Override
    public Iterator iterator() {
        return new SkyIterator(list);
    }
}

地煞容器:


public class LandCompany implements Company {

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

public LandCompany() {
        list.add(new Bawcock("朱武","神机军师","地魁星","军师参赞"));
        //此处省略70行代码
        list.add(new Bawcock("段景住","金毛犬","地狗星","机密情报营头领"));
    }

public List<Bawcock> getList(){
        return list;
    }

@Override
    public Iterator iterator() {
        return new LandIterator(list);
    }
}

天罡迭代器:


public class SkyIterator implements Iterator {

private List<Bawcock> bawcockList;
    private int position;

public SkyIterator(List<Bawcock> bawcockList) {
        this.bawcockList = bawcockList;
    }

@Override
    public boolean hasNext() {
        return !(position > bawcockList.size() - 1 || bawcockList.get(position) == null);
    }

@Override
    public Object next() {
        Bawcock bawcock = bawcockList.get(position);
        position++;
        return bawcock;
    }
}

地煞迭代器:


public class LandIterator implements Iterator {

private List<Bawcock> bawcockList;
    private int position;

public LandIterator(List<Bawcock> bawcockList) {
        this.bawcockList = bawcockList;
    }

@Override
    public boolean hasNext() {
        return !(position > bawcockList.size() - 1 || bawcockList.get(position) == null);
    }

@Override
    public Object next() {
        Bawcock bawcock = bawcockList.get(position);
        position++;
        return bawcock;
    }
}

好汉类:


public class Bawcock {

private String name;//姓名
    private String nickname;//绰号
    private String constellation;//星座
    private String position;//职位

    public Bawcock(String name, String nickname, String constellation, String position) {
        this.name = name;
        this.nickname = nickname;
        this.constellation = constellation;
        this.position = position;
    }

@Override
    public String toString() {
        return "Bawcock{" +
                "name='" + name + '\'' +
                ", nickname='" + nickname + '\'' +
                ", constellation='" + constellation + '\'' +
                ", position='" + position + '\'' +
                '}';
    }
}

皇帝可以用迭代器检阅梁山好汉的花名册:


public static void check(Iterator iterator){
    while(iterator.hasNext()){
        Log.e("皇帝翻阅花名册",iterator.next().toString());
    }
}

但是如果皇帝想要修改梁山好汉的职位的时候:“令宋江等分开军马,各归原所”,就会得到这个的答复:“俺等众头领,生死相随,誓不相舍!端的要如此,我们只得再回梁山泊去”。尽管道君皇帝宋徽宗碰了一鼻子灰,但我们明白了迭代器模式如何保证数据的安全。

Android源码中的迭代器模式

(1)List和Map

迭代器模式一般不会交给开发者实现,Java的常见数据结构List和Map等都自带迭代器。

(2)SQLiteDatabase

当我们使用SQLiteDatabase的query方法查询数据库时,会返回一个Cursor游标对象,这就是一个迭代器。

Android开发中如何利用迭代器模式

迭代器模式的优点很明显:支持以不同的方法去遍历一个容器对象,也可以有多个遍历,弱化了容器类与遍历算法之间的关系。在遍历一个容器对象时迭代器模式作用非常明显,比如自定义一个支持多选的图片选择器。

需要注意的几个问题

(1)迭代器模式在Java语言中具有相应的内置实现,极少数情况才需要开发者自己实现迭代器。

(2)迭代器模式增加类文件,造成代码臃肿。

时间: 2024-10-13 21:21:54

【设计模式与Android】迭代器模式——容器遍历,细节隐藏的相关文章

设计模式C++实现——迭代器模式

模式定义 迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 迭代器模式让我们能游走于聚合内的每一个元素,而又不暴露其内部的表示.把游走的任务放在迭代器上,而不是聚合上.这样简化了聚合的接口和实现,也让责任各得其所. 模式结构: Iterator:迭代器定义访问和遍历元素的接口 ConcreteIterator:具体迭代器实现迭代器接口:对该聚合遍历时跟踪当前位置 Aggregate:聚合定义创建相应的迭代器对象接口 ConcreteAggregate:具体聚合实现

设计模式入门之迭代器模式Iterator

迭代器模式定义:提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部实现 迭代器模式的结构和说明 Iterator::迭代器接口.定义访问和遍历元素的接口 ConcreteIterator:具体的迭代器实现对象.实现对聚合对象的遍历,并跟踪遍历时的当前位置 Aggregate:聚合对象.定义创建相应迭代器对象的接口 ConcreteAggregate:具体聚合对象.实现创建相应的迭代器对象 实例:一个公司,工资列表是用List实现的,后收购一家公司,工资列表是用Array实现

c#设计模式系列:迭代器模式(Iterator)

引言 迭代器模式是针对集合对象而生的,对于集合对象而言,肯定会涉及到对集合的添加和删除操作,同时也肯定支持遍历集合元素的操作,我们此时可以把遍历操作放在集合对象中,但这样的话,集合对象既承担太多的责任了,面向对象设计原则中有一条就是单一职责原则,所有我们要尽可能地分离这些职责,用不同的类取承担不同的责任,迭代器模式就是用迭代器类来承担遍历集合的职责. 迭代器模式的介绍 迭代器模式的定义 迭代器模式提供了一种方法顺序访问一个聚合对象中的各个元素,而又无需暴露该对象的内部实现,这样既可以做到不暴露集

Java设计模式(二) 之 迭代器模式

源码均以JDK1.8作为参考 1.定义: Iterator提供一种方法访问一个容器对象中各个元素,而又不需要暴露对象的内部细节. 2.解析: 通用类图: 类图解析: 2.1.Iterator抽象迭代器 抽象迭代器负责定义通用的接口约定,基本都是基于JDK中Iterator接口的定义,源码如下: public interface Iterator<E> { boolean hasNext(); E next(); default void remove() { throw new Unsuppo

Java设计模式学习记录-迭代器模式

前言 这次要介绍的是迭代器模式,也是一种行为模式.我现在觉得写博客有点应付了,前阵子一天一篇,感觉这样其实有点没理解透彻就写下来了,而且写完后自己也没有多看几遍,上次在面试的时候被问到java中的I/O的各种实现用到了什么设计模式,我愣是想半天没想出来了,人家还给提示了我也没想出来,最后还是面试官给出的答案,是装饰模式,听到答案后就恍然大悟了,前两天刚看了装饰模式,还写下了I/O操作中的各种类都是用到了装饰模式,后来想想两方面原因造成的当时没回答出来,一是面试时紧张就容易想不起来,二是对设计模式

设计模式之三:迭代器模式(IteratorPattern)

迭代器(Iterator)模式,又叫游标(Cursor)模式.其定义为:提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节.迭代器模式是和容器相关的,对容器对象的访问设计到遍历算法. 迭代器模式由以下角色组成: 迭代器角色(Iterator):迭代器角色负责定义访问和遍历元素的接口. 具体迭代器角色(Concrete Iterator):具体迭代器角色要实现迭代器接口,并记录遍历中的当前位置. 容器角色(Container):容器角色负责提供创建具体迭代器角色的接口. 具体容器

Java设计模式8:迭代器模式

迭代器模式 迭代器模式又叫做游标(Cursor)模式,其作用是提供一种方法访问一个容器元素中的各个对象,而又不暴露该对象的内部细节. 迭代器模式结构 迭代器模式由以下角色组成: 1.迭代器角色 负责定义访问和遍历元素的接口 2.具体迭代器角色 实现迭代器接口,并要记录遍历中的当前位置 3.容器角色 负责提供创建具体迭代器角色的接口 4.具体容器角色 实现创建具体迭代器角色的接口,这个具体迭代器角色与该容器的结构相关 迭代器模式在JDK中的应用及解读 迭代器模式就不自己写例子了,直接使用JDK中的

设计模式 ( 十四 ) 迭代器模式Iterator(对象行为型)

1.概述 类中的面向对象编程封装应用逻辑.类,就是实例化的对象,每个单独的对象都有一个特定的身份和状态.单独的对象是一种组织代码的有用方法,但通常你会处理一组对象或者集合. 集合不一定是均一的.图形用户界面框架中的 Window 对象可以收集任意数量的控制对象 - Menu.Slider 和 Button.并且,集合的实现可以有多种方式:PHP 数字是一个集合,但也是一个散列表,一个链接列表,一个堆栈以及队列. 例子1:电视遥控器的频道遍历 2.问题 如何操纵任意的对象集合? 如一个列表(Lis

设计模式--20、迭代器模式

[转载]迭代器模式 定义:提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节. 类型:行为类模式 类图: 1 public static void main(String[] args) { 2 List<Object> list = new ArrayList<Object>(); 3 list.add("a"); 4 list.add("b"); 5 list.add("c"); 6 Aggregate