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

相关文章

来自专栏个人随笔

Java 持久化操作之 --io流与序列化

1)File类操作文件的属性 1.File类的常用方法 ? 1. 文件的绝对完整路径:getAbsolutePath() 文件名:getName() 文件相对路...

2779
来自专栏程序员的SOD蜜

不使用反射的实体类方案

看过很多ORM的实体类方案,大多是用反射来读数据库数据,这样当频繁操作实体类的时候效率很低,我借鉴了一位朋友的思路,采用.NET 2.0的泛型技术,为实体类提供...

2088
来自专栏java达人

装饰器模式与io类体系结构

出于灵活性和降低类层次复杂度的考虑,我们倾向于使用组合而非继承来达到系统功能复用的目的,而装饰器模式正是组合的一种模式。Java中装饰器模式最典型的例子是io类...

1849
来自专栏码匠的流水账

聊聊flink LocalEnvironment的execute方法

flink-java-1.6.2-sources.jar!/org/apache/flink/api/java/DataSet.java

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

浅谈CGLIB动态代理和JDK动态代理 学习笔记

2324
来自专栏desperate633

Java的HashSet vs. TreeSet vs. LinkedHashSet比较

set是用来存储没有重复的元素的。set在java中有三种比较常用实现:HashSet, TreeSet and LinkedHashSet。所以,不同的时候我...

784
来自专栏闻道于事

Java之IO流补充

IO流例子 package com.hanqi.maya.util; import java.io.BufferedReader; import java.i...

32910
来自专栏Android Note

Android—Room数据库多表查询(Relationships)

1442
来自专栏mathor

BufferedIo

993
来自专栏10km的专栏

java:Set,Map排序输出到Writer

一般来说java.util.Set,java.util.Map输出的内容的顺序并不是按key的顺序排列的,但是java.util.TreeMap,java.ut...

1779

扫码关注云+社区