一、概述
    给定一种语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
二、适用性
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. 王五

GoF23种设计模式之行为型模式之迭代器模式的更多相关文章

  1. GoF23种设计模式之行为型模式之状态模式

    一.概述         定义对象之间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. 二.适用性 1.一个对象的行为取决于它的状态,并且它必须在运行时刻 ...

  2. GoF23种设计模式之行为型模式之策略模式

    传送门 ☞ 轮子的专栏 ☞ 转载请注明 ☞ http://blog.csdn.net/leverage_1229 1概述           定义一系列算法,把它们一个个都封装起来,并且让它们可以相互 ...

  3. GoF23种设计模式之创建型模式之原型模式

    一.概述 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 二.适用性 1.当一个系统应该独立于它的产品创建.构成和表示的时候. 2.当要实例化的类是在运行时刻指定的时候,例如:通过动 ...

  4. GoF23种设计模式之行为型模式之解释器模式

    一.概述         给定一种语言和其文法的一种表示,再定义一个解释器,该解释器使用表示来解释语言中的句子. 二.适用性              当需要解释一种语言,并且可以将该语言中的句子表示 ...

  5. GoF23种设计模式之行为型模式之观察者模式

    一.概述        定义对象之间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.二.适用性1.当一个抽象模型有两个方面,其中一个方面依赖于另一方面的时 ...

  6. GoF23种设计模式之行为型模式之访问者模式

    概述 表示一个作用于某对象结构中的各元素的操作. 它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 适用性 1.一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依 ...

  7. GoF23种设计模式之创建型模式之工厂方法模式

    一.概述 定义一个用于创建对象的接口,让子类去决定实例化哪个类.工厂方法将一个类的实例化延迟至其子类. 二.适用性 1.当一个类不知道它所必须创建的对象的类的时候. 2.当一个类希望由其子类来指定它所 ...

  8. GoF23种设计模式之创建型模式之抽象工厂模式

    一.概述 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 二.适用性 1.一个系统要独立于它的产品的创建.组合和表示的时候. 2.一个系统要由多个产品系列中的一个来配置的时候. ...

  9. GoF23种设计模式之创建型模式之建造者模式

    一.概述 将一个复杂对象的构建与其表示分离开来,使得同样的构建过程可以创建不同的表示. 二.适用性 1.当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式的时候. 2.当构造过程必须允许 ...

随机推荐

  1. bzoj4650: [Noi2016]优秀的拆分 hash

    好气啊,没开longlong又biubiu了 底层: 用hash或者奇奇怪怪的算法兹磁logn求最长公共前后缀 思路: 统计出从一个点开始和结束的形如AA的子串的个数 统计的时候把相邻的结果相乘加起来 ...

  2. NET Core 1.1 静态文件、路由、自定义中间件、身份验证简介

    NET Core 1.1 静态文件.路由.自定义中间件.身份验证简介   概述 之前写过一篇关于<ASP.NET Core 1.0 静态文件.路由.自定义中间件.身份验证简介>的文章,主要 ...

  3. [RDL]中多行组列组占比报表制作

    结果如下: 生意额占比表达式:=iif(Fields!生意额.Value is nothing,"",Fields!生意额.Value/sum(Fields!生意额.Value, ...

  4. dubbo注解

    如果还不了解Dubbo是什么或者不知道怎么搭建的可以先看一下我的上一篇文章. 首先我先来讲下提供者(也就是服务端)的配置,先上配置文件代码: <?xml version="1.0&qu ...

  5. CSS中的定位机制

    CSS3 中有三种定位机制 : 普通文档流 (text)| 浮动(float) | 定位(position) 普通文档流 就是CSS中默认的文本文档 普通流中,元素位置由文档顺序和元素性质决定,块级元 ...

  6. 数据结构-List接口-LinkedList类-Set接口-HashSet类-Collection总结

    一.数据结构:4种--<需补充> 1.堆栈结构:     特点:LIFO(后进先出);栈的入口/出口都在顶端位置;压栈就是存元素/弹栈就是取元素;     代表类:Stack;     其 ...

  7. 大家一起和snailren学java-(序)

    由于最近在面试实习的时候,发现自己的java基础还是不是特别的扎实.因此再重新深入学习一下java.每天学习一点,都能进步一些. 用书<Thinking in java><effec ...

  8. tsung基准测试方法、理解tsung.xml配置文件、tsung统计报告简介

    网上搜集的资料,资料来源于:http://blog.sina.com.cn/ishouke 1.tsung基准测试方法 https://pan.baidu.com/s/1Ne3FYo8XyelnJy8 ...

  9. javaSe-常用的类之Calender

    Calendar是java中常用的类,比data类使用更加方便,更能更加强大,好吧多的不用你说了,直接上代码 import java.util.Calendar;//需要引进的包 public cla ...

  10. 【Python图像特征的音乐序列生成】一个更科学的图片分类参考方法,以及一个看起来很好用的数据集

    数据集地址:http://www.imageemotion.org/ 论文地址:http://www.doc88.com/p-1905670442096.html