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 条评论
登录 后参与评论

相关文章

来自专栏菩提树下的杨过

Flash/Flex学习笔记(8):ActionScript3.0中的面对对象

首先要习惯AS3.0的几个BT约定: 1.一个.as文件中,只能定义一个类 2.类名称必须与.as的文件名相同 3.类定义中必须要有package包声明 4.一...

1679
来自专栏IMWeb前端团队

你真的了解浅比较么?

本文作者:IMWeb 黄qiong 原文出处:IMWeb社区 未经同意,禁止转载 背景 在学习react PureComponent的时候,看到有一句...

2438
来自专栏cmazxiaoma的架构师之路

你应该会的一道多线程笔试题

2233
来自专栏趣学算法

数据结构 第7讲 循环队列

过了一段时间,小张再也受不了这种"起早贪黑"的有车生活。为了解决胡同停车问题,小张跑了无数次居委会,终于将挡在胡同口的建筑清除,这样住在胡同尽头的小张,就可以早...

1002
来自专栏谦谦君子修罗刀

swift4.0语法杂记(精简版)

一、swift简史 1、介绍 swift是苹果公司于2014年推出用于撰写OS和iOS应用程序的语言。它由苹果开发者工具部门总监“克里斯.拉特纳”在2010年...

3899
来自专栏软件开发 -- 分享 互助 成长

迭代器模式

一、简介 1、迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。 2、类成员 (1)Iterator(迭代器)迭代器定义访问和...

1985
来自专栏Python

python 三元表达式 if for 构建List 进阶用法

Python中,for...[if]...语句一种简洁的构建List的方法,从for给定的List中选择出满足if条件的元素组成新的List,其中if是可以省略...

1040
来自专栏xingoo, 一个梦想做发明家的程序员

【设计模式】—— 迭代模式Iterator

  模式意图   提供一个方法按顺序遍历一个集合内的元素,而又不需要暴露该对象的内部表示。   应用场景   1 访问一个聚合的对象,而不需要暴露对象的内部表...

17610
来自专栏小小挖掘机

这或许是我见过的最简单的正则表达式教程(三)

五一劳动节来啦,小小挖掘机们小编们首先祝大家劳动节快乐! 作为中国放假大学的一员,除了趁着长达8天的五一春假好好休整之外,当然还要忙中偷闲补习一下python的...

2544
来自专栏java学习

面试题35(关于局部变量与全局变量的理解?)

下面代码的运行结果是? public class Demon { public static void main(String[] args) { St...

2475

扫码关注云+社区