一、迭代器模式概述

  提供一种可以遍历聚合对象的方式。又称为:游标(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. CSS布局 — 圣杯布局与双飞翼布局

    圣杯布局 实现原理 html代码中,middle部分首先要放在container的最前部分,然后是left,right 将三者都设置 float:left, position:relative (因为 ...

  2. 基于centos的docker安装

    1. 安装需求 内核版本3.10以上 Centos 7以上 64位版本 2. 使用root登录或者具有sudo权限 3. 确保系统是最新的 yum update 4. 添加yum源 tee /etc/ ...

  3. rsync的服务端和客户端搭建

    首先要看看有没有rsync,没有就按装一个rsync 1配置文件 然后创建rsyncd.conf文件,并添加如下内容(文件默认不存在) [root@chensiqi2 backup]# cat /et ...

  4. Markdown_04_折叠语法

    目录 一.折叠语法 参考资料 一.折叠语法 主要使用的是 html5的 details标签 (1)示例如下: <details> <summary>折叠文本</summa ...

  5. 【转】busybox分析——arp设置ARP缓存表中的mac地址

    [转]busybox分析——arp设置ARP缓存表中的mac地址 转自:http://blog.chinaunix.net/uid-26009923-id-5098083.html 1. 将arp缓存 ...

  6. 块级元素display:inline-block 在IE6 IE7无效

    ie6,ie7中,对块级元素设置display:inline-block,无效. 所以要先设置为inline,再触发haslayout .div1{ /*重点代码开始*/ display: inlin ...

  7. Spring容器三种注入类型

    Spring注入有三种方式: 1.Set注入(使用最多) 2.构造器注入(使用不多) 3.接口注入(几乎不用)不做测试了 1.Set注入:所谓Set注入就是容器内部调用了bean的Set***方法,注 ...

  8. SpringInAction--XML配置Spring Aop

    前面学习了如何用注解的方式去配置Spring aop,今天把XML配置的方法也看了下,下面顺便也做了个记录 先把spring中用xml配置aop的配置元素给贴出来: <aop:advisor&g ...

  9. Linux系统下超级用户密码的修改

    1)重启系统:在虚拟机刚启动界面,不停地按上下键,停止系统的自动引导(界面底部有提示) 2) 按 e 进入编辑模式 3) 编辑内容如下:完成后按Ctrl+x    (具体编辑内容为下图:删除倒数第三行 ...

  10. Java -- 使用阻塞队列(BlockingQueue)控制线程通信

    BlockingQueeu接口是Queue的子接口,但是它的主要作用并不是作为容器,而是作为线程同步的工具. 特征: 当生产者线程试图向BlockingQueue中放入元素时,如果该队列已满,则该线程 ...