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 ...
 
随机推荐
- laravel5.5种的Eloquent ORM的使用:
			
控制器方法: //Eloquent ORM的使用: public function orm1() { //all() /*$students=Student::all(); dd($students) ...
 - Qt界面(控件)相关设计
			
(转自:http://blog.chinaunix.net/uid-25799257-id-600157.html) 引言 最近在做数据库相关课程设计,所以就借此机会,先熟悉一下Qt的一些编程,同时 ...
 - (MSSQL)sp_refreshview刷新视图失败及更新Table字段失败的问题解决
			
在近期工作中遇到一个任务,需要批量更改散布在很多Table中的某字段,同时刷新相关视图,但是在执行脚本时,发现了如下问题 更新字段问题 消息 ,级别 ,状态 ,第 行 对象'View_Simple' ...
 - LeetCode OJ:Valid Sudoku(有效数独问题)
			
Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could be ...
 - redis高级应用特征
			
Redis高级应用特性 1.安全性 2.主从复制 3.事务处理 4.持久化机制 5.发布订阅消息 6.虚拟内存的使用 安全性 设置客户端连接后进行任何其他指定前需要使用的密码. 警告:因为redis速 ...
 - PriorityBlockingQueue用法
			
摘自<Java编程思想> package com.test.concurrency; import java.util.ArrayList; import java.util.List; ...
 - windows下gvim搭建IDE
			
原文转载自:手把手教你把Vim改装成一个IDE编程环境(图文) 如侵犯您的版权,请联系:windeal12@qq.com By: 吴垠 Date: 2007-09-07 Version: 0.5 Em ...
 - This is very likely to create a memory leak. Stack trace of thread
			
1.错误描述 警告: The web application [cmp] appears to have started a thread named [Abandoned connection cl ...
 - EasyDSS流媒体服务器实现RTMP直播同步HLS录像和时移回放
			
本文转自EasyDarwin团队成员Alex的博客:http://blog.csdn.net/cai6811376/article/details/74166337 "目前在市面上可以找到的 ...
 - Split功能的思想实现
			
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using S ...