JAVA 设计模式 迭代器模式

用途

迭代器模式 (Iterator)

提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示

迭代器模式是一种行为型模式

结构

图-迭代器模式结构图

Iterator : 定义访问元素的接口。

 interface Iterator {
 public Object first();
 public Object next();
 public boolean isDone();
 public Object currentItem();
 } 

ConcreteIterator : 实现 Iterator 接口。记录当前访问的元素在集合中的位置信息。

 class ConcreteIterator implements Iterator {
 private int current = 0;
 private ConcreteAggregate aggregate;
 
 public ConcreteIterator(ConcreteAggregate aggregate) {
 this.aggregate = aggregate;
     }
 
     @Override
 public Object first() {
 return aggregate.get(0);
     }
 
     @Override
 public Object next() {
         current++;
 if (current < aggregate.size()) {
 return aggregate.get(current);
         }
 return null;
     }
 
     @Override
 public boolean isDone() {
 return (current >= aggregate.size()) ? true : false;
     }
 
     @Override
 public Object currentItem() {
 return aggregate.get(current);
     }
 } 

Aggregate : 定义创建 Iterator 对象的接口。

 interface Aggregate {
 public Iterator CreateIterator();
 } 

ConcreteAggregate : 实现 Iterator 接口,返回一个合适的 ConcreteIterator 实例。

 class ConcreteAggregate implements Aggregate {
 private List<Object> items = new ArrayList<Object>();
 
     @Override
 public Iterator CreateIterator() {
 return new ConcreteIterator(this);
     }
 
 public int size() {
 return items.size();
     }
 
 public Object get(int index) {
 return items.get(index);
     }
 
 public void set(int index, Object element) {
         items.set(index, element);
     }
 
 public void add(Object element) {
         items.add(element);
     }
 } 

测试代码

 public class IteratorPattern {
 public static void main(String[] args) {
         ConcreteAggregate aggregate = new ConcreteAggregate();
         aggregate.add("张三");
         aggregate.add("李四");
         aggregate.add("王五");
         aggregate.add("赵六");
 
         Iterator iter = new ConcreteIterator(aggregate);
         Object item = iter.first();
         System.out.println("第一个人是:" + item);
         System.out.println("所有人的名单是:");
 while (!iter.isDone()) {
             System.out.println(iter.currentItem());
             iter.next();
         }
     }
 } 

运行结果

第一个人是:张三
 所有人的名单是:
 张三
 李四
 王五
 赵六

应用场景

访问一个聚合对象的内容而无需暴露它的内部表示。 支持对聚合对象的多种遍历。 为遍历不同的聚合结构提供一个统一的接口。

推荐

本文属于 JAVA设计模式系列

参考资料

《大话设计模式》《HeadFirst设计模式》

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏前端架构

谈谈javascript语法里一些难点问题-js变量, 栈区,作用域

这是一个令人诧异的结果,为什么第一个弹出框显示的是undefined,而不是1呢?这种疑惑的原理我描述如下:

591
来自专栏小灰灰

Java容器篇小结之Map自问自答

采用问答的方式对常见的问题进行整理小结 I. Map篇 0. 什么是Map 看到这个有点懵逼,一时还真不知道怎么解释,能让完全没有接触过的人都能听懂 想到生活...

18310
来自专栏大闲人柴毛毛

Java异常体系中的秘密

相信大家每天都在使用Java异常机制,也相信大家对try-catch-finally执行流程烂熟于胸。本文将介绍Java异常机制的一些细节问题,这些问题虽然很...

30810
来自专栏Java技术

Java虚拟机之垃圾收集器(5)

(1)Java 内存运行时区域的各个部分,其中程序计数器、虚拟机栈、本地方法栈三个区域随线程而生,随线程而灭;栈中的栈帧随着方法的进入和退出而有条不紊地执行着出...

544
来自专栏别先生

Scala学习教程笔记三之函数式编程、集合操作、模式匹配、类型参数、隐式转换、Actor、

1:Scala和Java的对比: 1.1:Scala中的函数是Java中完全没有的概念。因为Java是完全面向对象的编程语言,没有任何面向过程编程语言的特性,因...

3115
来自专栏Java Web

Java 面试知识点解析(一)——基础知识篇

2065
来自专栏Android机动车

Java 基础(四)——集合源码解析 List

前面我们学习了Iterator、Collection,为集合的学习打下了基础,现在我们来学习集合的第一大体系 List。

764
来自专栏编程心路

你不知道的 equals 和 ==

i1 == i2 和 i1.equals(i2) 这两个都是 true,大多数人应该可以答对。后面的 i3 == i4 和 i3.equals(i4) 估计就...

562
来自专栏java达人

最有价值的50道java面试题(二)

来自骆昊的技术专栏 26、抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被synchron...

20010
来自专栏Android中高级开发

Android并发编程 开篇

该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列。该系列引用了《Android开发艺术探索...

421

扫码关注云+社区