23种设计模式(14)java迭代器模式

 更新时间:2017年12月07日 09:02:36   作者:阿木侠  
这篇文章主要为大家详细介绍了23种设计模式之java迭代器模式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

23种设计模式第十四篇:java迭代器模式

定义:提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节。

类型:行为类模式

类图:

如果要问java中使用最多的一种模式,答案不是单例模式,也不是工厂模式,更不是策略模式,而是迭代器模式,先来看一段代码吧:

public static void print(Collection coll){ 
  Iterator it = coll.iterator(); 
  while(it.hasNext()){ 
    String str = (String)it.next(); 
    System.out.println(str); 
  } 
}

这个方法的作用是循环打印一个字符串集合,里面就用到了迭代器模式,java语言已经完整地实现了迭代器模式,Iterator翻译成汉语就是迭代器的意思。提到迭代器,首先它是与集合相关的,集合也叫聚集、容器等,我们可以将集合看成是一个可以包容对象的容器,例如List,Set,Map,甚至数组都可以叫做集合,而迭代器的作用就是把容器中的对象一个一个地遍历出来。

迭代器模式的结构

抽象容器:一般是一个接口,提供一个iterator()方法,例如java中的Collection接口,List接口,Set接口等。
具体容器:就是抽象容器的具体实现类,比如List接口的有序列表实现ArrayList,List接口的链表实现LinkList,Set接口的哈希列表的实现HashSet等。
抽象迭代器:定义遍历元素所需要的方法,一般来说会有这么三个方法:取得第一个元素的方法first(),取得下一个元素的方法next(),判断是否遍历结束的方法isDone()(或者叫hasNext()),移出当前对象的方法remove(),
迭代器实现:实现迭代器接口中定义的方法,完成集合的迭代。

代码实现

interface Iterator { 
    public Object next(); 
    public boolean hasNext(); 
  } 
  
  class ConcreteIterator implements Iterator{ 
    private List list = new ArrayList(); 
    private int cursor =0; 
    public ConcreteIterator(List list){ 
      this.list = list; 
    } 
    public boolean hasNext() { 
      if(cursor==list.size()){ 
        return false; 
      } 
      return true; 
    } 
    public Object next() { 
      Object obj = null; 
      if(this.hasNext()){ 
        obj = this.list.get(cursor++); 
      } 
      return obj; 
    } 
  } 
  interface Aggregate { 
    public void add(Object obj); 
    public void remove(Object obj); 
    public Iterator iterator(); 
  } 
  
  class ConcreteAggregate implements Aggregate { 
    private List list = new ArrayList(); 
    public void add(Object obj) { 
      list.add(obj); 
    } 
   
    public Iterator iterator() { 
      return new ConcreteIterator(list); 
    } 
   
    public void remove(Object obj) { 
      list.remove(obj); 
    } 
  } 
  
  public class Client { 
    public static void main(String[] args){ 
      Aggregate ag = new ConcreteAggregate(); 
      ag.add("小明"); 
      ag.add("小红"); 
      ag.add("小刚"); 
      Iterator it = ag.iterator(); 
      while(it.hasNext()){ 
        String str = (String)it.next(); 
        System.out.println(str); 
      } 
    } 
  }

上面的代码中,Aggregate是容器类接口,大家可以想象一下Collection,List,Set等,Aggregate就是他们的简化版,容器类接口中主要有三个方法:添加对象方法add、删除对象方法remove、取得迭代器方法iterator。Iterator是迭代器接口,主要有两个方法:取得迭代对象方法next,判断是否迭代完成方法hasNext,大家可以对比java.util.List和java.util.Iterator两个接口自行思考。

迭代器模式的优点:

        简化了遍历方式,对于对象集合的遍历,还是比较麻烦的,对于数组或者有序列表,我们尚可以通过游标来取得,但用户需要在对集合了解很清楚的前提下,自行遍历对象,但是对于hash表来说,用户遍历起来就比较麻烦了。而引入了迭代器方法后,用户用起来就简单的多了。
        可以提供多种遍历方式,比如说对有序列表,我们可以根据需要提供正序遍历,倒序遍历两种迭代器,用户用起来只需要得到我们实现好的迭代器,就可以方便的对集合进行遍历了。
        封装性良好,用户只需要得到迭代器就可以遍历,而对于遍历算法则不用去关心。

迭代器模式的缺点:

        对于比较简单的遍历(像数组或者有序列表),使用迭代器方式遍历较为繁琐,大家可能都有感觉,像ArrayList,我们宁可愿意使用for循环和get方法来遍历集合。

迭代器模式的适用场景

       迭代器模式是与集合共生共死的,一般来说,我们只要实现一个集合,就需要同时提供这个集合的迭代器,就像java中的Collection,List、Set、Map等,这些集合都有自己的迭代器。假如我们要实现一个这样的新的容器,当然也需要引入迭代器模式,给我们的容器实现一个迭代器。

       但是,由于容器与迭代器的关系太密切了,所以大多数语言在实现容器的时候都给提供了迭代器,并且这些语言提供的容器和迭代器在绝大多数情况下就可以满足我们的需要,所以现在需要我们自己去实践迭代器模式的场景还是比较少见的,我们只需要使用语言中已有的容器和迭代器就可以了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java执行SQL脚本文件到数据库详解

    Java执行SQL脚本文件到数据库详解

    这篇文章主要为大家详细介绍了Java执行SQL脚本文件到数据库的相关方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • spring Boot与Mybatis整合优化详解

    spring Boot与Mybatis整合优化详解

    关于spring-boot与mybatis整合优化方面的介绍,就是Mybatis-Spring-boot-starter的介绍,具体内容详情大家参考下本文
    2017-07-07
  • java8中@Contended注解的使用

    java8中@Contended注解的使用

    本文主要介绍了java8中@Contended注解的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • 解决java try throw exception finally遇上return break continue造成异常丢失

    解决java try throw exception finally遇上return break conti

    这篇文章主要介绍了解决java try throw exception finally遇上return break continue造成异常丢失问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • 解决springboot服务启动报错:Unable to start embedded contain

    解决springboot服务启动报错:Unable to start embedded contain

    这篇文章主要介绍了解决springboot服务启动报错:Unable to start embedded contain的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • java 实现音乐播放器的简单实例

    java 实现音乐播放器的简单实例

    这篇文章主要介绍了java 实现音乐播放器的简单实例的相关资料,希望通过本文能帮助到大家,实现这样的功能,需要的朋友可以参考下
    2017-09-09
  • MyBatis-Plus将字段修改为空值的解决方案

    MyBatis-Plus将字段修改为空值的解决方案

    这篇文章主要介绍了MyBatis-Plus将字段修改为空值的解决方案,本文给大家分享三种常用的解决方案,感兴趣的朋友一起看看吧
    2023-12-12
  • javaweb图书商城设计之用户模块(1)

    javaweb图书商城设计之用户模块(1)

    这篇文章主要介绍了javaweb图书商城设计之用户模块的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • 简单谈谈Java 中的线程的几种状态

    简单谈谈Java 中的线程的几种状态

    这篇文章主要介绍了简单谈谈Java 中的线程的几种状态的相关资料,需要的朋友可以参考下
    2020-02-02
  • spring Boot打包部署到远程服务器的tomcat中

    spring Boot打包部署到远程服务器的tomcat中

    这篇文章主要给大家介绍了关于spring Boot打包部署到远程服务器的tomcat中的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-12-12

最新评论