一、概述
    给定一种语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
二、适用性
1.当访问一个聚合对象的内容而无需暴露它的内部表示的时候。
2.当对聚合对象的多种遍历提供支持的时候。
3.当为了遍历不同的聚合结构提供一个统一的接口的时候(多态迭代)。
三、参与者
1.Iterator:迭代器定义访问和遍历元素的接口。
2.ConcreteIterator:具体迭代器实现迭代器接口。对该聚合遍历时跟踪当前位置。
3.Aggregate:聚合定义创建相应迭代器对象的接口。
4.ConcreteAggregate:具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例.
四、类图

五、示例

Iterator

  1. package cn.lynn.iterator;
  2. public interface Iterator {
  3. public void first();
  4. public void last();
  5. public boolean hasNext();
  6. public Object next();
  7. }

ConcreteIterator

  1. package cn.lynn.iterator;
  2. public class IteratorImpl implements Iterator {
  3. private List list;
  4. private int index;
  5. public IteratorImpl(List list) {
  6. index = 0;
  7. this.list = list;
  8. }
  9. @Override
  10. public void first() {
  11. index = 0;
  12. }
  13. @Override
  14. public void last() {
  15. index = list.getSize();
  16. }
  17. @Override
  18. public boolean hasNext() {
  19. return index < list.getSize();
  20. }
  21. @Override
  22. public Object next() {
  23. Object obj = list.get(index);
  24. index++;
  25. return obj;
  26. }
  27. }

Aggregate

  1. package cn.lynn.iterator;
  2. public interface List {
  3. public Iterator iterator();
  4. public Object get(int index);
  5. public int getSize();
  6. public void add(Object obj);
  7. }

ConcreteAggregate

  1. package cn.lynn.iterator;
  2. public class ListImpl implements List {
  3. private Object[] objArr;
  4. private int index;
  5. private int size;
  6. public ListImpl() {
  7. index = 0;
  8. size = 0;
  9. objArr = new Object[50];
  10. }
  11. @Override
  12. public Iterator iterator() {
  13. return new IteratorImpl(this);
  14. }
  15. @Override
  16. public Object get(int index) {
  17. return objArr[index];
  18. }
  19. @Override
  20. public int getSize() {
  21. return size;
  22. }
  23. @Override
  24. public void add(Object obj) {
  25. objArr[index++] = obj;
  26. size++;
  27. }
  28. }

Client

  1. package cn.lynn.iterator;
  2. public class Client {
  3. public static void main(String[] args) {
  4. List list = new ListImpl();
  5. list.add("张三");
  6. list.add("李四");
  7. list.add("王五");
  8. Iterator iterator = list.iterator();
  9. while (iterator.hasNext()) {
  10. System.out.println(iterator.next());
  11. }
  12. System.out.println("********");
  13. for (int i = 0; i < list.getSize(); i++) {
  14. System.out.println(list.get(i));
  15. }
  16. }
  17. }

Result

    1. 张三
    2. 李四
    3. 王五
    4. ********
    5. 张三
    6. 李四
    7. 王五

最新文章

  1. 数据库mysql 基本命令
  2. [Java] 位运算
  3. DevExpress组件之——PopupMenu组件(转)
  4. xshell linux传文件
  5. C++实现多线程类Thread
  6. 什么是 docker?
  7. 自己动手写PHP MVC框架
  8. margin 还能够被缩回
  9. Apache Hadoop 2.0.2-alpha
  10. 基于puppeteer模拟登录抓取页面
  11. 单链表sLinkList类,模板类
  12. HTML5智能表单
  13. Jenkins进阶-Git多仓库代码下载编译 (13)
  14. 闲聊jQuery(一)
  15. tomcat报错catalina.sh: line 401: /usr/java/jdk1.7.52/bin/java: No such file or directory
  16. 安装express并创建工程
  17. php中explode和implode函数
  18. 【ASP.NET Web API教程】2.4 创建Web API的帮助页面[转]
  19. bzoj 4006 [JLOI2015]管道连接——斯坦纳树
  20. 学习一份百度的JavaScript编码规范

热门文章

  1. Uva10755
  2. oracle中CAST函数使用简介【转】
  3. 牛客网Java刷题知识点之什么是匿名内部类、匿名内部类的使用原则、匿名内部类初始化、匿名内部类使用的形参为何要为final 和 案例
  4. springmvc httprequest 使用@Autowired注解
  5. Mysql一个表编码的坑,mark一下
  6. CoreDataDemo
  7. Linux shell标准输入,标准输出,错误输出
  8. Windows基础环境_安装配置教程(Windows7 64、JDK1.8、Android SDK23.0、TortoiseSVN 1.9.5)
  9. Android商城开发系列(九)—— 首页频道布局的实现
  10. python基础教程总结7——异常