一、迭代器模式概述

  提供一种可以遍历聚合对象的方式。又称为:游标(cursor)模式

  结构:

    (1)聚合对象:存储数据

    (2)迭代器:遍历数据

二、迭代器模式示例代码

  定义:正向遍历迭代器和逆向遍历迭代器

 /**
* 自定义迭代器接口
* @author CL
*
*/
public interface MyIterator {
/**
* 如果仍有元素可以迭代,则返回 true
* @return
*/
boolean hasNext();
/**
* 返回迭代的下一个元素
* @return
*/
Object next();
/**
* 从迭代器指向的集合中移除迭代器返回的最后一个元素
*/
void remove(); }
 import java.util.ArrayList;
import java.util.List; /**
* 自定义聚合类
* @author CL
*
*/
public class ConcreteAggregate {
private List<Object> list; public ConcreteAggregate() {
list = new ArrayList<Object>();
} public boolean addObject(Object obj) {
return this.list.add(obj);
} public boolean removeObject(Object obj) {
return this.list.remove(obj);
} /**
* 获得正向遍历的迭代器对象
* @return
*/
public MyIterator creatIterator() {
return new ConcreteIterator(0);
} /**
* 获得逆向遍历的迭代器对象
* @return
*/
public MyIterator creatConverseIterator() {
return new ConcreteIterator(list.size()-1);
} /**
* 自定义迭代器内部类
* @author CL
*
*/
private class ConcreteIterator implements MyIterator { private int cursor; private final int firstValue; public ConcreteIterator(int cursor) {
this.cursor = cursor;
this.firstValue = cursor;
} @Override
public boolean hasNext() {
if (firstValue == 0) { //正向遍历
if (cursor < list.size()) {
return true;
}
} else if (firstValue == list.size()-1) { //逆向遍历
if (cursor >= 0) {
return true;
}
}
return false;
} @Override
public Object next() {
if (firstValue == 0) { //正向遍历
if (cursor < list.size()) {
return list.get(cursor++);
}
} else if (firstValue == list.size()-1) { //逆向遍历
if (cursor >= 0) {
return list.get(cursor--);
}
}
return null;
} @Override
public void remove() {
list.remove(cursor);
}
}
}

  测试:

 /**
* 测试迭代器对象
* @author CL
*
*/
public class Client { public static void main(String[] args) {
ConcreteAggregate ca = new ConcreteAggregate();
ca.addObject("aa");
ca.addObject("bb");
ca.addObject("cc");
ca.addObject("dd"); System.out.println("正向遍历:");
MyIterator it = ca.creatIterator();
while (it.hasNext()) {
System.out.println(it.next());
} System.out.println("逆向遍历:");
MyIterator it2 = ca.creatConverseIterator();
while (it2.hasNext()) {
System.out.println(it2.next());
}
}
}

  控制台输出:

正向遍历:
aa
bb
cc
dd
逆向遍历:
dd
cc
bb
aa

三、迭代器模式常见开发应用场景

  (1)JDK内置的迭代器(List / Set)

      List / Set 实现了 Collection 接口,Collection 实现了 Iterator 接口。

  (2)…………

GOF23设计模式之迭代器模式(iterator)的更多相关文章

  1. 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern)

    原文:乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) 作者:weba ...

  2. 设计模式学习--迭代器模式(Iterator Pattern)和组合模式(Composite Pattern)

    设计模式学习--迭代器模式(Iterator Pattern) 概述 ——————————————————————————————————————————————————— 迭代器模式提供一种方法顺序 ...

  3. 二十四种设计模式:迭代器模式(Iterator Pattern)

    迭代器模式(Iterator Pattern) 介绍提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示. 示例有一个Message实体类,某聚合对象内的各个元素均为该实体对象,现 ...

  4. 【GOF23设计模式】迭代器模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_迭代器模式.JDK内置迭代器.内部类迭代器 package com.test.iterator; /** * 自定义的迭代 ...

  5. 设计模式之迭代器模式(Iterator)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  6. [设计模式] 16 迭代器模式 Iterator Pattern

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对迭代器模式是这样说的:提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露该对象的内部表示. 类图和实例: 迭代器模式由以下角 ...

  7. 设计模式 笔记 迭代器模式 Iterator

    //---------------------------15/04/26---------------------------- //Iterator 迭代器模式----对象行为型模式 /* 1:意 ...

  8. 行为型设计模式之迭代器模式(Iterator)

    结构 意图 提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示. 适用性 访问一个聚合对象的内容而无需暴露它的内部表示. 支持对聚合对象的多种遍历. 为遍历不同的聚合结构提供一 ...

  9. 设计模式之迭代器模式 Iterator

    代码实现 public interface MyIterator { void first(); //将游标指向第一个元素 void next(); //将游标指向下一个元素 boolean hasN ...

随机推荐

  1. Java进阶7 并发优化2 并行程序设计模式

    Java进阶7 并发优化2 并行程序设计模式20131114 1.Master-worker模式 前面讲解了Future模式,并且使用了简单的FutureTask来实现并发中的Future模式.下面介 ...

  2. HDU 3172 Virtual Friends(map+并查集)

    Virtual Friends Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Tot ...

  3. redis的String类型以及其操作

    Redis的数据类型 String类型以及操作 String是最简单的数据类型,一个key对应一个Value,String类型是二进制安全的.Redis的String可以包含任何数据,比如jpg图片或 ...

  4. Xcode Server (Xcode9)搭建CI

    Xcode 9将Xcode Server集成进来了,这是Xcode一个新特性,不用去单独下载server了,server可以用来做CI.自动化Test等等.这里主要介绍搭建CI,相当简单 打开开关,新 ...

  5. spinlock变量没有初始化

    http://blog.csdn.net/longwang155069/article/details/52224284

  6. ss-libev 源码解析udp篇 (2)

    UDP relay的代码基本都在udprelay.c中,无论ss-local还是ss-server的代码都在一起,使用宏MODULE_LOCAL,MODULE_REMOTE等区分开.代码虽然不是很多, ...

  7. python爬虫入门(2)re模块-正则表达式

    正则表达式 search //匹配第一次遇到符合规则的 匹配IP地址 import re re.search(r'(([01]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5])\.){3 ...

  8. js效果之回到顶部

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  9. 【Python学习】Thread笔记(1)

    Python学习笔记 - Thread(1) 标签(空格分隔): python from threading import Thread num = 2000 id_list = [] def do_ ...

  10. Mvc6 错误Microsoft.AspNet.Http.Features.IRequestIdentifierFeature

    System.TypeLoadException 未能从程序集“Microsoft.AspNet.Http.Features, Version=1.0.0.0, Culture=neutral, Pu ...