GOF23设计模式之迭代器模式(iterator)
一、迭代器模式概述
提供一种可以遍历聚合对象的方式。又称为:游标(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)的更多相关文章
- 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern)
原文:乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) 作者:weba ...
- 设计模式学习--迭代器模式(Iterator Pattern)和组合模式(Composite Pattern)
设计模式学习--迭代器模式(Iterator Pattern) 概述 ——————————————————————————————————————————————————— 迭代器模式提供一种方法顺序 ...
- 二十四种设计模式:迭代器模式(Iterator Pattern)
迭代器模式(Iterator Pattern) 介绍提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示. 示例有一个Message实体类,某聚合对象内的各个元素均为该实体对象,现 ...
- 【GOF23设计模式】迭代器模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_迭代器模式.JDK内置迭代器.内部类迭代器 package com.test.iterator; /** * 自定义的迭代 ...
- 设计模式之迭代器模式(Iterator)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- [设计模式] 16 迭代器模式 Iterator Pattern
在GOF的<设计模式:可复用面向对象软件的基础>一书中对迭代器模式是这样说的:提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露该对象的内部表示. 类图和实例: 迭代器模式由以下角 ...
- 设计模式 笔记 迭代器模式 Iterator
//---------------------------15/04/26---------------------------- //Iterator 迭代器模式----对象行为型模式 /* 1:意 ...
- 行为型设计模式之迭代器模式(Iterator)
结构 意图 提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示. 适用性 访问一个聚合对象的内容而无需暴露它的内部表示. 支持对聚合对象的多种遍历. 为遍历不同的聚合结构提供一 ...
- 设计模式之迭代器模式 Iterator
代码实现 public interface MyIterator { void first(); //将游标指向第一个元素 void next(); //将游标指向下一个元素 boolean hasN ...
随机推荐
- C# 与vb.net 的Dictionary(字典)的键、值排序
项目中可能需要用到Dictionary 排序,于是先做了一个小demo ,网上搜索真的没有能满足我需要的,都是类似的,于是理解改造,一上午就在查找,实践中过去了.现在把它实现了,把代码贴出来,算是一个 ...
- CocoaPods Mac App的安装和使用
CocoaPods桌面应用版下载地址:https://cocoapods.org/app打开应用会提示你是否安装命令行工具,选择install就也可以在命令行使用Pod了.省去了上面的步骤们,方便快捷 ...
- ElasticSearch自定义分词器
通过mapping中的映射,将&映射成and PUT /my_index?pretty' -H 'Content-Type: application/json' -d' { "set ...
- No style sheet with given id found错误
在chrome中打开html页面,报错No style sheet with given id found,解决方如下
- SDKMAN 软件开发工具包管理器
SDKMAN 是用来在类Unix 系统中管理多个版本的开发环境的工具.提供命令行接口来安装.切换.删除.列出候选版本. SDKMAN!是在大多数基于Unix的系统上管理多个软件开发套件的并行版本的工具 ...
- [置顶]
kubernetes1.7新特性:日志审计变化
背景概念 出于安全方面的考虑,Kubernetes提供了日志审计记录,用来记录不同普通用户.管理员和系统中各个组件的日志信息. Kubernetes日志审计是Kube-apiserver组件的一部分功 ...
- Vim技能修炼教程(5) - 操作符实务
操作符实务 操作符复习 上次我们讲了操作符与文本对象的组合这样一个vim的强大功能.但是上节的知识点过于密集,可读性可能差了一点.不过没关系,重要的知识点在后面用到的时候我们可以先复习一下. 我们还是 ...
- matplotlib 数据可视化
图的基本结构 通常,使用 numpy 组织数据, 使用 matplotlib API 进行数据图像绘制. 一幅数据图基本上包括如下结构: Data: 数据区,包括数据点.描绘形状 Axis: 坐标轴, ...
- Mysql Innodb 引擎优化 参数(innodb_buffer_pool_size)
在mysql的学习过程中,要是不把一些基本概率弄的很清楚,难免显得过于不专业. 作用: 这个参数主要作用是缓存innodb表的索引,数据,插入数据时的缓冲 默认值:128M 专用mysql服务器设置的 ...
- Git 中文教程
以下内容转载自:http://www.open-open.com/lib/view/open1328928294702.html Git是一个分布式的版本控制工具,本篇文章从介绍Git开始,重点 在于 ...