不说模式的问题,看一个<<设计模式之禅>>里面的例子。
老板要看到公司了各个项目的情况。(我知道我这个概述很让人头大,看代码吧)

示例程序

v1

package Iterator;/*** @author cbf4Life cbf4life@126.com* 定义一个接口,所有的项目都是一个接口*/
public interface IProject {//从老板这里看到的就是项目信息public String getProjectInfo();
}
package Iterator;/*** @author cbf4Life cbf4life@126.com* 所有项目的信息类*/
public class Project implements IProject {//项目名称private String name = "";//项目成员数量private int num = 0;//项目费用private int cost = 0;//定义一个构造函数,把所有老板需要看到的信息存储起来public Project(String name,int num,int cost){//赋值到类的成员变量中this.name = name;this.num = num;this.cost=cost;}//得到项目的信息public String getProjectInfo() {String info = "";//获得项目的名称info = info+ "项目名称是:" + this.name;//获得项目人数info = info + "\t项目人数: "+ this.num;//项目费用info = info+ "\t 项目费用:"+ this.cost;return info;}}package Iterator;import java.util.ArrayList;/*** @author cbf4Life cbf4life@126.com* 老板来看项目信息了*/
public class Boss {public static void main(String[] args) {//定义一个List,存放所有的项目对象ArrayList<IProject> projectList = new ArrayList<IProject>();//增加星球大战项目projectList.add(new Project("星球大战项目",10,10));//增加扭转时空项目projectList.add(new Project("扭转时空项目",100,1000));//增加超人改造项目projectList.add(new Project("超人改造项目",10000,100000));//这边100个项目for(int i=4;i<10;i++)projectList.add(new Project("第"+i+"个项目",i*5,i*100));        //遍历一下ArrayList,把所有的数据都取出for(IProject project:projectList)System.out.println(project.getProjectInfo());}
}

类图如下:

实在太简单了,没什么说的。
不过现在,我想提几个问题。
多个对象聚在一起形成的总体叫做聚集(Aggregate)。在java中就是实现了Collection接口的那些类。我们在学习c的时候就接触的数组就是最最基本的聚集,在java中,数组也是其他聚集类型的设计基础。
从1.2版本开始java就提供了多种聚集,Vector,ArrayList,Stack,LinkList,HashSet,TreeSet,HashMap,TreeMap等等。
数组,堆栈,散列表有多种存储结构,如果我不想有数组来存储工程信息了要换成散列表,上面的代码就得大改(其实,我得承认这个假设本身就有问题,很少会有人没事闲得慌改存储结构,我们只是举个例子,引出我们下面要说的问题)
我们希望,java中的各种聚集都能提供一种"迭代"的功能。
ok 看我们的下个版本

从图中能看到,我们已经使用了jdk提供的迭代器相关模块。

v2

public interface Iterable<T> {Iterator<T> iterator();
}

Iterable接口,任何能"具有迭代"功能的聚集都要实现这个接口,它也只有一个方法,返回聚集的迭代器。

public interface Iterator<E> {boolean hasNext();E next();void remove();
}

Iterator接口,就是具体的迭代器。
大家在理解迭代器模式的时候,不妨这样想,一个聚集能够遍历自身,之前是因为我们用for循环依次取出每个元素,现在引入了模式后,遍历的功能就交给迭代器这个类(接口)了。
现在看代码

package iterator.v2;import java.util.ArrayList;
import java.util.Iterator;/*** @author cbf4Life cbf4life@126.com* 定义一个迭代器*/
public class ProjectIterator implements Iterator<Object>{//所有的项目都放在这里ArrayList中private ArrayList<IProject> projectList = new ArrayList<IProject>();private int currentItem = 0;//构造函数出入projectListpublic ProjectIterator(ArrayList<IProject> projectList){this.projectList = projectList;}//判断是否还有元素,必须实现public boolean hasNext() {//定义一个返回值boolean b = true;if(this.currentItem>=projectList.size() || this.projectList.get(this.currentItem) == null){b =false;}return b;}//取得下一个值public IProject next() {return (IProject)this.projectList.get(this.currentItem++);}//删除一个对象public void remove() {//暂时没有使用到}}
package iterator.v2;import java.util.Iterator;/*** @author cbf4Life cbf4life@126.com* 定义一个接口,所有的项目都是一个接口*/
public interface IProject  extends Iterable<Object>{//增加项目public void add(String name,int num,int cost);//从老板这里看到的就是项目信息public String getProjectInfo();    public Iterator<Object> iterator();
}
package iterator.v2;import java.util.ArrayList;
import java.util.Iterator;/*** @author cbf4Life cbf4life@126.com* 所有项目的信息类*/
@SuppressWarnings("all")
public class Project implements IProject {//定义一个项目列表,说有的项目都放在这里private ArrayList<IProject> projectList = new ArrayList<IProject>();//项目名称private String name = "";//项目成员数量private int num = 0;//项目费用private int cost = 0;public Project(){}//定义一个构造函数,把所有老板需要看到的信息存储起来private Project(String name,int num,int cost){...}//增加项目public void add(String name,int num,int cost){this.projectList.add(new Project(name,num,cost));}//得到项目的信息public String getProjectInfo() {...}//产生一个遍历对象public Iterator<Object> iterator(){return new ProjectIterator(this.projectList);}}
package iterator.v2;/*** @author cbf4Life cbf4life@126.com* 老板来看项目信息了*/
public class Boss {public static void main(String[] args) {//定义一个List,存放所有的项目对象IProject project = new Project();//增加星球大战项目project.add("星球大战项目ddddd",10,100);//增加扭转时空项目project.add("扭转时空项目",100,10000);//增加超人改造项目project.add("超人改造项目",10000,1000000);//这边100个项目for(int i=4;i<14;i++){project.add("第"+i+"个项目",i*5,i*1000);}//遍历一下ArrayList,把所有的数据都取出ProjectIterator projectIterator = (ProjectIterator) project.iterator();while(projectIterator.hasNext()){IProject p = (IProject)projectIterator.next();System.out.println(p.getProjectInfo());}}
}

迭代器模式的通用类图

图里面的具体迭代器与具体聚集之间的关系有点意思,这一点希望大家多看看代码。
另一方面,我们也可以把ProjectIterator作为内部类放置在projcet类里,这样迭代器就能直接访问到projectList。
后面我们这样改了之后再boss类里面
ProjectIterator projectIterator = (ProjectIterator) project.iterator();
代码依然可以用,这就是创建与使用分离的好处,也就是工厂模式的好处。

jdk的迭代器模式在聚集中的应用

uml图

在AbstractList中有以下两个方法

    public ListIterator<E> listIterator() {return new ListItr(0);}public Iterator<E> iterator() {return new Itr();}

不管是上面的uml图还是下面的代码,大家现在心里一定有个问题,ListItr与Itr是怎么回事。

其实我们只要看看AbstractList的源代码就能明白:Iterator接口里面的方法实在是太少了,hasNext,next,remove就三个方法;从遍历上来说也就是正向遍历,我要是想逆向遍历一下怎么办?ListItr就有这个功能
下面再看一段代码:

import java.util.*;public class IteratorDemo {public static void process(Collection c) {Iterator i = c.iterator(); //创建迭代器对象//通过迭代器遍历聚合对象while(i.hasNext()) {System.out.println(i.next().toString());}}public static void main(String args[]) {Collection persons;persons = new ArrayList(); //创建一个ArrayList类型的聚合对象persons.add("张无忌");persons.add("小龙女");persons.add("令狐冲");persons.add("韦小宝");persons.add("袁紫衣");persons.add("小龙女");process(persons);}
}

我们现在是用ArrayList来存储数据,要是想换成HashSet很简单,也就
persons = new HashSet<String>(); //创建一个ArrayList类型的聚合对象
一行代码的事。

下面还有一个问题,一个班级(Class in School)包含多个学生(Student),使用Java内置迭代器实现对学生信息的遍历,要求按学生年龄由大到小的次序输出学生信息。
怎么做,这个咱们下一节来讨论。

参考资料

java与模式
设计模式之禅 第二十章 迭代器模式
http://blog.csdn.net/lovelion/article/details/9992005 遍历聚合对象中的元素——迭代器模式            (很多资料都是参考自刘伟老师的博客)

java集合类中的迭代器模式相关推荐

  1. java集合类中的迭代器

    import java.util.*; class CollectionDemo{public static void main(String[]args){iterator();}//增加元素pub ...

  2. Java集合类中removeAll和remove的区别

    Java 集合类中的 List.removeAll() 方法用于从列表中移除指定 collection 中包含的所有元素. 语法:removeAll(Collection<?>c) 该方法 ...

  3. Java设计模式 (1) —— Iterator迭代器模式

    拿到这个话题,首先搞清楚:什么是迭代器? 大家都学过 for-i 循环,for-i循环的本质就是 通过i++ 或者 i-- ,以实现 从数据的一端 一个一个地遍历数据元素,直到另一端的最后一个元素,将 ...

  4. Java集合类中绝对占有一席之地的List,涨薪7K!

    一.先来解读:23种设计模式要点 1.单例模式(Singleton Pattern) 2.工厂模式 3.抽象工厂模式(Abstract Factory Pattern) 4.模板方法模式(Templa ...

  5. Java设计模式系列之——迭代器模式

    本篇我们采取倒叙的手法来讲解迭代器模式,先看下面一段我们在平时工作中常见的代码: package com.mazhichu.designpatterns.iterator;import java.ut ...

  6. java策略管理_详解Java编程中的策略模式

    策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以在不影响到客户端的情况下发生变化. 策略模式的结构 策略模式 ...

  7. Java 8中的策略模式

    这是两个有关如何使用Java 8功能样式以及Cyclops模式匹配和Hamcrest库来实现策略模式设计的示例. PrintDependingOnInput方法是一种策略,该策略将根据传递的日志在Sy ...

  8. 用java代码实现Singleton_为什么在Java代码中实现Singleton模式(有时)被认为是Java世界中的反模式?...

    测试 一个原因是单元不容易用单元测试处理.你不能控制实例化,并且它们的性质可能跨调用保持状态. 为此,dependency injection的原则是流行的.每个类都注入(配置)他们需要的函数(而不是 ...

  9. 用java代码实现Singleton,为什么在Java代码中实现Singleton模式(有时被认为是Java世界中的反模式)?...

    I have seen some people in SO commenting that Singleton Pattern is an anti-pattern. I want to know w ...

最新文章

  1. 《JAVA练习题目4》 训练要点:String和StringTokenizer的使用,以及排序算法。
  2. python【力扣LeetCode算法题库】14-最长公共前缀(列表解压)
  3. Snort日志输出插件详解
  4. windows 8 安装iis .net 3.5
  5. 架构的“一小步”,业务的一大步 1
  6. latex 可视化生成表格代码
  7. 流程图动画效果html,jQuery创意线条步骤流程图动画特效
  8. [zhuan]asp.net程序性能优化的七个方面 (c#(或vb.net)程序改进)
  9. mtkwin10驱动_MTK手机刷机驱动下载|MTK通用USB刷机驱动 Win7/Win10 自动安装版 下载_当下软件园_软件下载...
  10. 基于stm32单片机的电梯控制系统
  11. 基于C++的菜鸟驿站
  12. Snipaste下载安装(使用教程)
  13. 化工自动化石油化工的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  14. 公务员计算机职称有哪些,2017职称考试有哪些
  15. 晶闸管整流桥matlab仿真,整流12脉中频电源MATLAB-Simulink仿真及谐波分析
  16. word2010公式编辑器 格式设置
  17. 月下夜想曲200.6(攻略2)
  18. 数据分析师未来发展前景如何?
  19. win10+cuda10.0+pytorch安装
  20. 一张图片,根据区域,跳转不同链接

热门文章

  1. 用 python 写游戏《外星人入侵》完整代码
  2. 达梦数据库DM8导出sql脚本
  3. matlab 1g等于多少byte,1G等于多少MB 1G有多大?
  4. eWebEditor V7.3 for asp版本编辑器带后的破解码版本,新增加防止图片木马上传
  5. win11关闭启用集成WINDOWS验证
  6. 经济师考试如何报考和备考?
  7. layui 省市区三级联动
  8. Linux中系统引导过程各类问题的修复方法
  9. 架构(二):如何对现有系统做微服务改造?
  10. CSS学习笔记10:超链接样式