java设计模式----迭代子模式
顺序访问聚集中的对象,主要用于集合中。一是需要遍历的对象,即聚集对象,二是迭代器对象,用于对聚集对象进行遍历访问。 迭代子模式为遍历集合提供了统一的接口方法。从而使得客户端不需要知道聚集的内部结构就能就能对聚集进行遍历等操作。Iterator模式是用于遍历集合类的标准访问方法。它可以把访问逻辑从不同类型的集合类中抽象出来,从而避免向客户端暴露集合的内部结构。
例如,如果没有使用Iterator,遍历一个数组的方法是使用索引:
for(int i=0; i<array.size(); i++) {
... get(i) ... }
而访问一个链表(LinkedList)又必须使用while循环:
while((e=e.next())!=null) { ... e.data() ... }
以上两种方法客户端都必须事先知道集合的内部结构,访问代码和集合本身是紧耦合,无法将访问逻辑从集合类和客户端代码中分离出来,每一种集合对应一种遍历方法,客户端代码无法复用。
更恐怖的是,如果以后需要把ArrayList更换为LinkedList,则原来的客户端代码必须全部重写。
为解决以上问题,Iterator模式总是用同一种逻辑来遍历集合:
for(Iterator it = c.iterater();
it.hasNext(); ) { ... }
奥秘在于客户端自身不维护遍历集合的"指针",所有的内部状态(如当前元素位置,是否有下一个元素)都由Iterator来维护,而这个Iterator由集合类通过工厂方法生成,因此,它知道如何遍历整个集合。
客户端从不直接和集合类打交道,它总是控制Iterator,向它发送"向前","向后","取当前元素"的命令,就可以间接遍历整个集合。
好的,迭代子模式主要有5个对象
抽象迭代子角色:定义了遍历聚集的接口。
具体迭代子角色:实现了抽象迭代子接口。
抽象聚集角色:定义聚集的公共方法,并为聚集创建迭代子(Iterator)对象。
具体聚集角色:能够返回一个实现迭代子(Iterator)接口的迭代子实例。
客户端角色:持有对聚集和迭代子实例的引用,通过迭代子对聚集进行迭代。
抽象迭代子角色:
package iterator;
public interface Iterator {
public Object First();
public Object previous();
public Object Next();
public boolean hasNext();
}
抽象聚集角色:
package iterator;
public abstract class Collection {
public abstract Iterator iterator();
public abstract int size();
public abstract Object getElement(int index);
}
具体聚集角色:
package iterator;
public class ChildCollection extends Collection{
//创建一个字符串数组
public String items[] = {"A","B","C","D","E"};
/*集合初始化,获取集合实例*/
@Override
public Iterator iterator() {
return new IteratorImplement(this);
}
/*获取数组的长度*/
@Override
public int size() {
return items.length;
}
/*获取数组元素的位置*/
@Override
public Object getElement(int index) {
return items[index];
}
}
具体迭代子角色:
package iterator;
public class ChildCollection extends Collection{
//创建一个字符串数组
public String items[] = {"A","B","C","D","E"};
/*集合初始化,获取集合实例*/
@Override
public Iterator iterator() {
return new IteratorImplement(this);
}
/*获取数组的长度*/
@Override
public int size() {
return items.length;
}
/*获取数组元素的位置*/
@Override
public Object getElement(int index) {
return items[index];
}
}
客户端角色:
package iterator;
public class Client {
public static void main(String[] args) {
/*创建实例*/
Collection collection=new ChildCollection();
/*获取集合迭代对象*/
Iterator iterator=collection.iterator();
while(iterator.hasNext()){
System.out.println(iterator.Next());
}
}
}
结果:
A
B
C
D
E
可以看看jdk源码,我们实现了jdk中Iterator的功能。有点区别就是Collection也实现了Iterator接口,在Collection子类里面可以根据不同的类(比如数组、ArrayList、LinkedList)在各个类实现Iterator接口,仅仅是内部实现的方式不一样,实现方法是一样的。
java设计模式----迭代子模式的更多相关文章
- Java设计模式-迭代子模式(Iterator)
顾名思义,迭代器模式就是顺序访问聚集中的对象,一般来说,集合中非常常见,如果对集合类比较熟悉的话,理解本模式会十分轻松.这句话包含两层意思:一是需要遍历的对象,即聚集对象,二是迭代器对象,用于对聚集对 ...
- [工作中的设计模式]迭代子模式Iterator
一.模式解析 迭代子模式又叫游标(Cursor)模式,是对象的行为模式.迭代子模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象 1.迭代子模式一般用于对集合框架的访问,常用的集合框架为lis ...
- JAVA设计模式之迭代子模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述迭代子(Iterator)模式的: 迭代子模式又叫游标(Cursor)模式,是对象的行为模式.迭代子模式可以顺序地访问一个聚集中的元素而不 ...
- 设计模式《JAVA与模式》之迭代子模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述迭代子(Iterator)模式的: 迭代子模式又叫游标(Cursor)模式,是对象的行为模式.迭代子模式可以顺序地访问一个聚集中的元素而不 ...
- java设计模式8.迭代子模式、责任链模式、命令模式
迭代子模式 迭代子模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象.它将迭代逻辑封装到一个独立的迭代子对象中,从而与聚集本身分开.迭代子对象是对遍历的抽象化,不同的聚集对象可以提供相同的迭代 ...
- Java设计模式(18)——行为模式之迭代子模式(Iterator)
一.概述 概念 UML简图 // Aggregate:聚集(集合) 角色 抽象迭代子:定义遍历元素所需要的接口 具体迭代子:实现抽象迭代子接口,保持游标 聚集/具体聚集:定义/实现创建迭代子对象的接口 ...
- [设计模式]迭代子模式 Iterator
迭代子模式又叫做游标cursor模式,是对象的行为模式.迭代子模式可以顺序的访问一个聚集中的元素而不必暴露聚集的内部表象. 迭代子模式被广泛的应用在Java语言的API中的几个设计模式之一.在Java ...
- Java设计模式(12)迭代模式(Iterator模式)
上了这么多年学,我发现一个问题,好象老师都很喜欢点名,甚至点名都成了某些老师的嗜好,一日不点名,就饭吃不香,觉睡不好似的,我就觉得很奇怪,你的课要是讲的好,同学又怎么会不来听课呢,殊不知:“误人子弟, ...
- 《JAVA与模式》之迭代子模式
迭代子模式又叫游标(Cursor)模式,是对象的行为模式.迭代子模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象(internal representation). 聚集和JAVA聚集 多个 ...
随机推荐
- Oracle的sql语句中关键字冲突用双引号
select distinc user from instrument where created>"TO_DATE"('2015-02-05 12:00:00', 'yyy ...
- 封装自己的yQuery
function myAddEvent(obj, sEv, fn) { if (obj.attachEvent) { obj.attachEvent('on' + sEv, fn) } else { ...
- python中的map()函数
MapReduce的设计灵感来自于函数式编程,这里不打算提MapReduce,就拿python中的map()函数来学习一下. 文档中的介绍在这里: map(function, iterable, .. ...
- Altera特殊管脚的使用(适用全系列Altera FPGA,MSEL区别除外)-来自altera论坛
1.I/O, ASDO 在AS 模式下是专用输出脚,在PS 和JTAG 模式下可以当I/O 脚来用.在AS 模式下,这个脚是CII 向串行配置芯片发送控制信号的脚.也是用来从配置芯片中读配置数据的脚 ...
- xss过滤函数
XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中. 比如这些代码包括HTML代码和客户端脚本. function remove_xss($ ...
- write solid code 零散(原文)
整理下目录,看了这个文件,幸好未删除. 以下是<write solid code>中的原文摘录. 1.How could I have prevented this bug? 2.How ...
- Unity利用UI的Mask实现对精灵Sprite的遮挡
例如剔除掉船超出河流的一部分,实现让船只在河流之上显示. 其实是利用UI层的Mask实现遮罩,有些不同的是Mask的图片是用Camera渲染到RenderTexture动态产生的纹理实现的.大概步骤如 ...
- KAFKA安装+配置详解+常用操作+监控
http://blog.csdn.net/hadas_wang/article/details/50056381 http://qiyishi.blog.51cto.com/5731577/18575 ...
- 前端架构一之XAMPP
摘要: 随着用户体验的重要性和项目的富客户端化,越来越多的公司将前端与后端分离开来,这时候前端就需要有自己的服务环境.本文将介绍我在开发中所用到的前端服务环境的搭建. 环境: OS: win7 64b ...
- 移植opencv到pcDuino
OpenCV是一个基于(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows和Mac OS操作系统上.它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Pytho ...