频道栏目
首页 > 资讯 > 其他 > 正文

java23种设计模式:迭代器模式详解

18-02-22        来源:[db:作者]  
收藏   我要投稿

迭代器模式是使用率最高的几个设计模式之一,被广泛地应用到java的API中。例如,java的集合(Collection)中,就广泛使用迭代器来遍历集合中的元素。

一.迭代器模式的现实场景

习大所在的重案组破获了一起特大的贩毒团伙案件,组长安排习大对罪犯进行审问。
习大走进审讯室堆犯罪嫌疑人XX说:“你们团伙已经被我们全部捣毁,坦白从宽,抗拒从严。所以希望你能配合我们,这样我们或许能帮你申请从轻处理”;
犯罪嫌疑人,经过内心一番挣扎后,对习大说:“警察同志,我保证完全配合你们”。
习大:你在贩毒团伙中担任什么角色。
XX:我主要负责联系卖家和买家。
习大:你们的货源只要从哪里来的。
XX:主要是从M国境外,具体的是谁,我也不知道,一般是上面安排下来的。
习大:你负责的毒品都销往哪个地方。
XX:我们主要负责SH市的销售,一般都是一些娱乐会所来我们这里拿货。
习大:说一下经常来你这里拿货的人的姓名。
XX:梁XX,卢XX,吕XX。。。
。。。

上面场景中,警察在审讯室中审问犯人XX的对话,类似于设计模式中的迭代器模式。

二.迭代器模式(Iiterator Pattern)的定义

提供一种方法,访问一个容器对象中的各个元素,而不是需要暴露该对象的内容。

三.迭代器模式的类图

1

四.迭代器模式的三个角色

1. 抽象迭代器(Iterator)角色

该角色负责定义访问和遍历元素的接口

2. 具体迭代器(Concrete Iterator)模式

该角色实现Iterator接口,完成容器元素的遍历。

3. 抽象聚集(Aggregate)角色

该角色提供创建迭代器角色的接口

4. 具体聚集(Concrete Aggregate)角色

该角色实现抽象聚集接口,创建出容纳迭代器的对象。
其实就是能存放数据的容器,相当于ArrayList

五.迭代器模式的优缺点

迭代器模式中的优点

1. 迭代器模式简化了访问容器元素的操作,具备统一的遍历接口。

2.封装遍历算法,使算法独立于聚集角色。客户无需知道聚集对象的类型,即使聚集对象的类型发生变化,也不会影响遍历过程。

3.迭代器模式給使用者一种序列化的错觉,而产生错误。

4.迭代器的元素都是Object类型,没有类型特征(JDK1.5后通过引入泛型可以解决此问题)。

六.迭代器模式的使用场景

迭代器已经被广泛使用,甚至成为一个最基础的工具。设置有人建议将迭代器模式从23种设计模式中移除,因为迭代器太普遍了,它已经融入到各种语言和工具中。
JDK1.2开始,就增加了java.util.Iterator接口,并将Iterator应用到各个聚集类(Collection)中,如ArrayList、Vector、Stack、HashSet等等集合类都实现了iterator方法,返回一个迭代器Iterator,便于堆集合中的元素进行遍历。

在java开发中,尽量不要自己写迭代器模式,使用java API提供的Iterator一般就能满足项目需求。

七.迭代器模式的示例

这里使用上面的现实场景做代码示例。

示例的类图

方法的作用看代码。。。

示例的代码

以使用java API中迭代器Iterator遍历集合中的元素,用来模拟上面现实场景中警察审问犯人的对话为例,演示迭代器模式的应用。

迭代器测试类

package p17_iterator;

import java.util.ArrayList;
import java.util.Iterator;

/**
 * 迭代器的使用示例
 */
public class IteratorDemo {
    public static void main(String[] args) {
        //定义一个集合放入对话的内容
        ArrayList list = new ArrayList();
        list.add("你们团伙已经被我们全部捣毁,坦白从宽,抗拒从严。所以希望你能配合我们,这样我们或许能帮你申请从轻处理");
        list.add("警察同志,我保证完全配合你们");
        list.add("你在贩毒团伙中担任什么角色");
        list.add("我主要负责联系卖家和买家");
        list.add("你们的货源只要从哪里来的");
        list.add("主要是从M国境外,具体的是谁,我也不知道,一般是上面安排下来的");
        list.add("你负责的毒品都销往哪个地方");
        list.add("我们主要负责SH市的销售,一般都是一些娱乐会所来我们这里拿货");
        list.add("说一下经常来你这里拿货的人的姓名");
        list.add("梁XX,卢XX,吕XX。。。");
        list.add("。。。");

        //遍历集合
        System.out.println("警察和犯罪嫌疑人审讯对话如下:");
        show(list.iterator());
    }

    //审讯过程
    private static void show(Iterator iterator) {
        int i=0;
        while (iterator.hasNext()){
            if (i%2==0){
                System.out.println("警察说 : " + iterator.next());
            }else{
                System.out.println("犯罪嫌疑人说 : "+iterator.next());
            }
        }
    }

}

这里ArrayList容器类的代码就不贴出来了,有1600多行,Iterator接口的代码也不少。
ArrayList继承几好几个接口,但是太多没啥用。
有用的无非是增删改查,遍历的查用的就是Iterator类的相关属性,
单个查用get(int index)
增加用add
修改用set

程序运行结果;

3

 

相关TAG标签
上一篇:如何使用 Android UI 设计聊天界面
下一篇:java开发中abstractCollection、List和AbstractList解析
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站