定义

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

UML

优点

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

缺点

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

应用场景

  1. 迭代器模式是与集合共生共死的,一般来说,我们只要实现一个集合,就需要同时提供这个集合的迭代器,就像java中的Collection,List、Set、Map等,这些集合都有自己的迭代器。假如我们要实现一个这样的新的容器,当然也需要引入迭代器模式,给我们的容器实现一个迭代器。
  2. 但是,由于容器与迭代器的关系太密切了,所以大多数语言在实现容器的时候都给提供了迭代器,并且这些语言提供的容器和迭代器在绝大多数情况下就可以满足我们的需要,所以现在需要我们自己去实践迭代器模式的场景还是比较少见的,我们只需要使用语言中已有的容器和迭代器就可以了。

示例

考虑这样一个需求,一家大公司合并了一家小公司,而两家公司的工资系统不一样,大公司使用List记录员工工资,小公司使用数组记录员工工资,而这两个不一样的工资系统需要合并进行查询所有人的工资,且需要打印出相同的结果时,我们可以使用迭代器模式来解决这个问题。

Java

 import java.util.ArrayList;
import java.util.List; public class Main
{
public static void main(String[] args)
{
//访问集团的工资列表
PayManager payManager = new PayManager();
//先计算再获取
payManager.calcPay();
System.out.println("集团工资列表:");
test(payManager.createIterator()); //访问新收购公司的工资列表
SalaryManager salaryManager = new SalaryManager();
//先计算再获取
salaryManager.calcSalary();
System.out.println("新收购的公司工资列表:");
test(salaryManager.createIterator());
} private static void test(Iterator it)
{
it.first();
while (!it.isDone())
{
Object obj = it.currentItem();
System.out.println("the obj==" + obj);
it.next();
}
} /**
* 工资模型
*/
public static class PayModel
{
/**
* 支付工资的人员
*/
private String userName; /**
* 支付的工资数额
*/
private double pay; public String getUserName()
{
return userName;
} public void setUserName(String userName)
{
this.userName = userName;
} public double getPay()
{
return pay;
} public void setPay(double pay)
{
this.pay = pay;
} public String toString()
{
return "userName=" + userName + ", pay=" + pay;
}
} /**
* 大公司员工工资管理器
*/
public static class PayManager extends Aggregate
{
/**
* 聚合对象,这里是Java的集合对象
*/
private List list = new ArrayList(); public List getPayList()
{
return list;
} public void calcPay()
{
PayModel pm1 = new PayModel();
pm1.setPay(3800);
pm1.setUserName("张三"); PayModel pm2 = new PayModel();
pm2.setPay(5800);
pm2.setUserName("李四"); list.add(pm1);
list.add(pm2);
} public Iterator createIterator()
{
return new CollectionIteratorImpl(this);
} public Object get(int index)
{
Object retObj = null;
if (index < this.list.size())
{
retObj = this.list.get(index);
}
return retObj;
} public int size()
{
return this.list.size();
}
} /**
* 小公司员工工资管理器
*/
public static class SalaryManager extends Aggregate
{
/**
* 用数组管理
*/
private PayModel[] pms = null; public PayModel[] getPays()
{
return pms;
} public void calcSalary()
{
//计算工资,并把工资信息填充到工资列表里面
//为了测试,做点假数据进去
PayModel pm1 = new PayModel();
pm1.setPay(2200);
pm1.setUserName("王五"); PayModel pm2 = new PayModel();
pm2.setPay(3600);
pm2.setUserName("赵六"); pms = new PayModel[2];
pms[0] = pm1;
pms[1] = pm2;
} public Iterator createIterator()
{
return new ArrayIteratorImpl(this);
} public Object get(int index)
{
Object retObj = null;
if (index < pms.length)
{
retObj = pms[index];
}
return retObj;
} public int size()
{
return this.pms.length;
}
} /**
* 集合接口
*/
public static abstract class Aggregate
{
/**
* 工厂方法,创建相应迭代器对象的接口
* @return 相应迭代器对象的接口
*/
public abstract Iterator createIterator();
} /**
* 迭代器接口
*/
public interface Iterator
{
void first(); void next(); boolean isDone(); Object currentItem();
} /**
* 数组迭代器
*/
public static class ArrayIteratorImpl implements Iterator
{
/**
* 用来存放被迭代的聚合对象
*/
private SalaryManager aggregate = null; private int index = -1; public ArrayIteratorImpl(SalaryManager aggregate)
{
this.aggregate = aggregate;
} @Override
public void first()
{
index = 0;
} @Override
public void next()
{
if (index < this.aggregate.size())
{
index = index + 1;
}
} @Override
public boolean isDone()
{
if (index == this.aggregate.size())
{
return true;
}
return false;
} @Override
public Object currentItem()
{
return this.aggregate.get(index);
}
} /**
* 集合列表迭代器
*/
public static class CollectionIteratorImpl implements Iterator
{
/**
* 用来存放被迭代的聚合对象
*/
private PayManager aggregate = null; private int index = -1; public CollectionIteratorImpl(PayManager aggregate)
{
this.aggregate = aggregate;
} @Override
public void first()
{
index = 0;
} @Override
public void next()
{
if (index < this.aggregate.size())
{
index = index + 1;
}
} @Override
public boolean isDone()
{
if (index == this.aggregate.size())
{
return true;
}
return false;
} @Override
public Object currentItem()
{
return this.aggregate.get(index);
}
}
}

最新文章

  1. Android实现播放器功能
  2. clearfix清除浮动
  3. chadang saidui
  4. 使用spring手动获取Bean的时候,不能强转回它自己。
  5. Speex回声消除代码分析
  6. android网络编程
  7. Linux单词表
  8. 周末充电之WPF(一).初试牛刀
  9. today&#39;s learning of english 2
  10. Root exploit for Android (adb setuid)
  11. 基于手机传感器数据使用 CNN 识别用户行为的 Tensroflow 实现
  12. EF 6.0
  13. Java-IO之FileDescriptor
  14. 如何用plugman编辑和添加cordova插件
  15. 【游戏开发】在Lua中实现面向对象特性——模拟类、继承、多态
  16. Proj.Net 投影介绍
  17. Vue-router(基础)_滚动行为和history模式
  18. -1-3 java集合框架基础 java集合体系结构 Collection 常用java集合框架 如何选择集合 迭代器 泛型 通配符概念 Properties 集合 迭代器
  19. webmagic爬虫抓取工作室成员博客
  20. 该 URL“XX”无效。它可能指向不存在的文件或文件夹,或者是指向不在当前网站中的有效文件或文件夹

热门文章

  1. Linux下ls与cp命令
  2. 【Android开发经验】怎样查看android-support-v4支持包中的源代码
  3. 在发送信息时应用PendingIntent.FLAG_UPDATE_CURRENT
  4. 修改主键id为自增
  5. MySql随手记要
  6. C#程序证书创建工具 (Makecert.exe)
  7. WCF入门教程(四)通过Host代码方式来承载服务 一个WCF使用TCP协议进行通协的例子 jquery ajax调用WCF,采用System.ServiceModel.WebHttpBinding System.ServiceModel.WSHttpBinding协议 学习WCF笔记之二 无废话WCF入门教程一[什么是WCF]
  8. win8 应用商店程序使用SQLITE数据库
  9. FaceBook登陆API -- Login with API calls
  10. PowerShell 获取Site Collection下被签出的文件