当前位置: 首页 > news >正文

《java与模式》学习系列——迭代子模式

 

一、 迭代子(Iterator)模式的结构

迭代子模式可以顺序访问一个聚集中的元素而不必暴露聚集的内部表象。

所下图所示:

迭代子可分为外禀迭代子和内禀迭代子。

外禀迭代子适合于白箱聚集(白箱聚集就是向外界提供访问自己内部元素接口的聚集),由于迭代的逻辑是由聚集对象本身提供的,所以这样的外禀迭代子角色往往仅仅保持迭代的游标位置。所以具体迭代子角色是一个外部类,它的构造函数接受一个具体聚集对象,从而可以调用这个聚集对象的迭代逻辑。

内禀迭代子适用于黑箱聚集(黑箱聚集不向外部提供遍历自己元素对象的接口),由于黑箱聚集的元素对象只可以被聚集内部成员访问,所以内禀迭代子只能是聚集内部的成员子类。

二、 迭代子模式在java中的应用

java聚集中的应用

java.util.Collection接口提供iterator()工厂方法返回一个Iterator类型对象,Collection接口的子类型AbstractList类的内部成员类Itr实现Iterator接口。所以Itr是内禀迭代子类,但是AbstractList也提供了自己的遍历方法,所以它不是黑箱聚集,而是白箱聚集。其代码如下:

import java.util.Iterator;

public interface Itr extends Iterator{

         //再次调用next()方法时所用的指标

         int cursor = 0;

         //最近一次调用时所用的指标

         int lastRet = -1;

         int expectedModCount = modCount;

         public boolean hasNext(){

                   return cursor!=size();

         }

         public Object next(){

                   try{

                            Object next = get(cursor);

                            checkForComodification();

                            lastRet = cursor++;

                            return next;

                   }catch(IndexOutOfBoundsException e){

                            checkForComodification();

                            throw new NoSuchElementException();

                   }

         }

         //删除最后遍历过的元素,remove()方法只能删除最后遍历的元素

         public void remove(){

                   if(lastRet ==-1)

                            throw new IllegalStateException();

                   checkForComodification();

                   try{

                            AbstractList.this.remove(lastRet);

                            if(lastRet<cursor)

                                     cursor--;

                            lastRet = -1;

                            expectedModCount = modCount;

                   }catch(IndexOutOfBoundsException e){

                            throw new ConcurrentModificationException();

                   }

         }

         public void checkForComodification(){

                   if(modCount!=expectedModCount)

                            throw new ConcurrentModificationException();

         }

}

其中的modCountget(cursor)等变量和方法均是AbstractList类所拥有,Itr可以直接使用。方法checkForComodification()会检查聚集的内容是否刚刚被外界直接修改过(不是通过迭代子提供的remove()方法修改的)。如果在迭代子开始后,聚集的内容被外界绕过迭代子对象而直接修改过年话,这个方法立即抛出异常。

另外:AbstractList类也提供了listIterator()方法,返回一个实现了Listiterator接口的类ListItr实例。ListIterator接口实现了正向迭代和逆向迭代,同时还提供了在迭代过程当中安全修改列的内容的方法。

EnumerationIterator的区别:1Enumeration没有remove方法(2Enumeration是在Vector中的element()方法中作用一个无名类实现的,它不支付Fail Fast,也就是说在迭代过程中,聚集对象被外界意外直接修改,则这个迭代过程还会立即捕获任何异常。

 

相关文章:

  • Werkzeug工具包学习-官方例子Shortly分析
  • 《java与模式》学习系列——责任链模式
  • iOS中的交换空间(swap space)
  • 《java与模式》学习系列——命令模式
  • Windows10中无法打开这个应用的解决方案
  • sqlbulkcopy 使用DataTable作为数据源的数据类型问题--来自数据源的String类型的给定值不能转换为指定目标列的类型 uniqueidentifier...
  • 《java与模式》学习系列——状态模式
  • debian终端菱形乱码修复
  • 《java与模式》学习系列——访问者模式
  • 《java与模式》学习系列——解释器模式
  • C#调用windwos系统数据源配置
  • 《java与模式》学习系列——调停者模式
  • [hibernate]基本值类型映射之日期类型
  • 《java与模式》学习系列——建造者模式
  • 【PL/SQL练习】基本的PL/SQL语句
  • python3.6+scrapy+mysql 爬虫实战
  • [nginx文档翻译系列] 控制nginx
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • canvas 绘制双线技巧
  • co模块的前端实现
  • django开发-定时任务的使用
  • dva中组件的懒加载
  • JavaScript类型识别
  • JavaScript中的对象个人分享
  • Java面向对象及其三大特征
  • PAT A1017 优先队列
  • SpringBoot几种定时任务的实现方式
  • WebSocket使用
  • 编写高质量JavaScript代码之并发
  • 反思总结然后整装待发
  • 基于axios的vue插件,让http请求更简单
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 近期前端发展计划
  • 手写双向链表LinkedList的几个常用功能
  • 推荐一个React的管理后台框架
  • 我的业余项目总结
  • 一份游戏开发学习路线
  • 一个JAVA程序员成长之路分享
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • elasticsearch-head插件安装
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #单片机(TB6600驱动42步进电机)
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (2)STL算法之元素计数
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转)IOS中获取各种文件的目录路径的方法
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • ***原理与防范
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008