一、迭代器模式概述

  提供一种可以遍历聚合对象的方式。又称为:游标(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. [Web UI]对比Angular/jQueryUI/Extjs:没有一个框架是万能的

    Angular不能做什么?对比Angular/jQueryUI/Extjs 框架就好比兵器,你得明白你手里拿的是屠龙刀还是倚天剑,刀法主要是砍,剑法主要是刺.对于那些职业喷子和脑残粉,小僧送你们两个字 ...

  2. ssh自动分发密匙脚本样板

    #!/bin/bash rom=/media/cdrom dir=/etc/yum.repos.d Use=$ mima=$ function yumj(){ [ -d "$rom" ...

  3. vue环境的搭建

    一.首先要安装nodejs : 别去官网下,慢的要死,这是国内的什么版本都有.地址 这是我下载的. 然后就傻瓜式安装. 验证是否安装成功 二.node.js的环境变量的新建.  //我安装的路径是D: ...

  4. LeetCode OJ:Climbing Stairs(攀爬台阶)

    You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...

  5. CocoaPods Mac App的安装和使用

    CocoaPods桌面应用版下载地址:https://cocoapods.org/app打开应用会提示你是否安装命令行工具,选择install就也可以在命令行使用Pod了.省去了上面的步骤们,方便快捷 ...

  6. 程序包需要 NuGet 客户端版本“2.12”或更高版本,但当前的 NuGet 版本为“2.8.50313.46”

    由于安装install-package newtonsoft.json 会出现需要 NuGet 客户端版本“2.12”或更高版本来安装,于是换成旧版的newtonsoft.json   PM> ...

  7. mac下初始化eclipse的安卓开发ndk开发环境

    最近电脑由windows换成mac了,很多环境都要重新搭建,顺便纪录下,方便以后查阅. 1.先到eclipse官网下载最新版eclipse,我下载的是neon版,下载后直接解压到即可使用(前提是你安装 ...

  8. LINUX中的DNS服务---DNS正向、反向和双向解析

    一.DNS的正向解析 也就是域名解析为IP地址进行访问! 1)vim  /etc/named.conf   ---->  删除forwarders所在行 2)vim  /etc/named.rf ...

  9. vue-keep-alive

    查看github源代码    https://github.com/Diamondjcx/vue-test Vue keep-alive实践总结   <keep-alive>是Vue的内置 ...

  10. vue 初级小总结

    (1)插值,即渲染文本 文本:数据绑定最常见的形式就是使用 {{...}}(双大括号)的文本插值 <h1>{{ message }}</h1> data() { return ...