《JAVA与模式》之迭代子模式
迭代子模式又叫游标(Cursor)模式,是对象的行为模式。迭代子模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象(internal representation)。
聚集和JAVA聚集
多个对象聚在一起形成的总体称之为聚集(Aggregate),聚集对象是能够包容一组对象的容器对象。聚集依赖于聚集结构的抽象化,具有复杂化和多样性。数组就是最基本的聚集,也是其他的JAVA聚集对象的设计基础。
JAVA聚集对象是实现了共同的java.util.Collection接口的对象,是JAVA语言对聚集概念的直接支持。从1.2版开始,JAVA语言提供了很多种聚集,包括Vector、ArrayList、HashSet、HashMap、Hashtable等,这些都是JAVA聚集的例子。
迭代子模式的结构
迭代子模式有两种实现方式,分别是白箱聚集与外禀迭代子和黑箱聚集于内禀迭代子。
白箱聚集与外禀迭代子
如果一个聚集的接口提供了可以用来修改聚集元素的方法,这个接口就是所谓的宽接口。
如果聚集对象为所有对象提供同一个接口,也就是宽接口的话,当然会满足迭代子模式对迭代子对象的要求。但是,这样会破坏对聚集对象的封装。这种提供宽接口的聚集叫做白箱聚集。聚集对象向外界提供同样的宽接口,如下图所示:
aaarticlea/png;base64,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" alt="" />
由于聚集自己实现迭代逻辑,并向外部提供适当的接口,使得迭代子可以从外部控制聚集元素的迭代过程。这样一来迭代子所控制的仅仅是一个游标而已,这种迭代子叫做游标迭代子(Cursor Iterator)。由于迭代子是在聚集结构之外的,因此这样的迭代子又叫做外禀迭代子(Extrinsic Iterator)。
现在看一看白箱聚集与外禀迭代子的实现。一个白箱聚集向外界提供访问自己内部元素的接口(称作遍历方法或者Traversing Method),从而使外禀迭代子可以通过聚集的遍历方法实现迭代功能。
因为迭代的逻辑是由聚集对象本身提供的,所以这样的外禀迭代子角色往往仅仅保持迭代的游标位置。
一个典型的由白箱聚集与外禀迭代子组成的系统如下图所示,在这个实现中具体迭代子角色是一个外部类,而具体聚集角色向外界提供遍历聚集元素的接口。
aaarticlea/png;base64,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" alt="" />
迭代子模式涉及到以下几个角色:
● 抽象迭代子(Iterator)角色:此抽象角色定义出遍历元素所需的接口。
● 具体迭代子(ConcreteIterator)角色:此角色实现了Iterator接口,并保持迭代过程中的游标位置。
● 聚集(Aggregate)角色:此抽象角色给出创建迭代子(Iterator)对象的接口。
● 具体聚集(ConcreteAggregate)角色:实现了创建迭代子(Iterator)对象的接口,返回一个合适的具体迭代子实例。
● 客户端(Client)角色:持有对聚集及其迭代子对象的引用,调用迭代子对象的迭代接口,也有可能通过迭代子操作聚集元素的增加和删除。
源代码
抽象聚集角色类,这个角色规定出所有的具体聚集必须实现的接口。迭代子模式要求聚集对象必须有一个工厂方法,也就是createIterator()方法,以向外界提供迭代子对象的实例。
public abstract class Aggregate {
/**
* 工厂方法,创建相应迭代子对象的接口
*/
public abstract Iterator createIterator();
}
具体聚集角色类,实现了抽象聚集角色类所要求的接口,也就是createIterator()方法。此外,还有方法getElement()向外界提供聚集元素,而方法size()向外界提供聚集的大小等。
public class ConcreteAggregate extends Aggregate { private Object[] objArray = null;
/**
* 构造方法,传入聚合对象的具体内容
*/
public ConcreteAggregate(Object[] objArray){
this.objArray = objArray;
} @Override
public Iterator createIterator() { return new ConcreteIterator(this);
}
/**
* 取值方法:向外界提供聚集元素
*/
public Object getElement(int index){ if(index < objArray.length){
return objArray[index];
}else{
return null;
}
}
/**
* 取值方法:向外界提供聚集的大小
*/
public int size(){
return objArray.length;
}
}
抽象迭代子角色类
public interface Iterator {
/**
* 迭代方法:移动到第一个元素
*/
public void first();
/**
* 迭代方法:移动到下一个元素
*/
public void next();
/**
* 迭代方法:是否为最后一个元素
*/
public boolean isDone();
/**
* 迭代方法:返还当前元素
*/
public Object currentItem();
}
具体迭代子角色类
public class ConcreteIterator implements Iterator {
//持有被迭代的具体的聚合对象
private ConcreteAggregate agg;
//内部索引,记录当前迭代到的索引位置
private int index = 0;
//记录当前聚集对象的大小
private int size = 0; public ConcreteIterator(ConcreteAggregate agg){
this.agg = agg;
this.size = agg.size();
index = 0;
}
/**
* 迭代方法:返还当前元素
*/
@Override
public Object currentItem() {
return agg.getElement(index);
}
/**
* 迭代方法:移动到第一个元素
*/
@Override
public void first() { index = 0;
}
/**
* 迭代方法:是否为最后一个元素
*/
@Override
public boolean isDone() {
return (index >= size);
}
/**
* 迭代方法:移动到下一个元素
*/
@Override
public void next() { if(index < size)
{
index ++;
}
} }
客户端类
public class Client { public void operation(){
Object[] objArray = {"One","Two","Three","Four","Five","Six"};
//创建聚合对象
Aggregate agg = new ConcreteAggregate(objArray);
//循环输出聚合对象中的值
Iterator it = agg.createIterator();
while(!it.isDone()){
System.out.println(it.currentItem());
it.next();
}
}
public static void main(String[] args) { Client client = new Client();
client.operation();
} }
上面的例子首先创建了一个聚集类实例,然后调用聚集对象的工厂方法createIterator()以得到一个迭代子对象。在得到迭代子的实例后,客户端开始迭代过程,打印出所有的聚集元素。
外禀迭代子的意义
一个常常会问的问题是:既然白箱聚集已经向外界提供了遍历方法,客户端已经可以自行进行迭代了,为什么还要应用迭代子模式,并创建一个迭代子对象进行迭代呢?
客户端当然可以自行进行迭代,不一定非得需要一个迭代子对象。但是,迭代子对象和迭代模式会将迭代过程抽象化,将作为迭代消费者的客户端与迭代负责人的迭代子责任分隔开,使得两者可以独立的演化。在聚集对象的种类发生变化,或者迭代的方法发生改变时,迭代子作为一个中介层可以吸收变化的因素,而避免修改客户端或者聚集本身。
此外,如果系统需要同时针对几个不同的聚集对象进行迭代,而这些聚集对象所提供的遍历方法有所不同时,使用迭代子模式和一个外界的迭代子对象是有意义的。具有同一迭代接口的不同迭代子对象处理具有不同遍历接口的聚集对象,使得系统可以使用一个统一的迭代接口进行所有的迭代。
黑箱聚集与内禀迭代子
如果一个聚集的接口没有提供修改聚集元素的方法,这样的接口就是所谓的窄接口。
聚集对象为迭代子对象提供一个宽接口,而为其他对象提供一个窄接口。换言之,聚集对象的内部结构应当对迭代子对象适当公开,以便迭代子对象能够对聚集对象有足够的了解,从而可以进行迭代操作。但是,聚集对象应当避免向其他的对象提供这些方法,因为其他对象应当经过迭代子对象进行这些工作,而不是直接操控聚集对象。
aaarticlea/png;base64,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" alt="" />
在JAVA语言中,实现双重接口的办法就是将迭代子类设计成聚集类的内部成员类。这样迭代子对象将可以像聚集对象的内部成员一样访问聚集对象的内部结构。下面给出一个示意性的实现,说明这种双重接口的结构时怎么样产生的,以及使用了双重接口结构之后迭代子模式的实现方案。这种同时保证聚集对象的封装和迭代子功能的实现的方案叫做黑箱实现方案。
由于迭代子是聚集的内部类,迭代子可以自由访问聚集的元素,所以迭代子可以自行实现迭代功能并控制对聚集元素的迭代逻辑。由于迭代子是在聚集的结构之内定义的,因此这样的迭代子又叫做内禀迭代子(Intrinsic Iterator)。
为了说明黑箱方案的细节,这里给出一个示意性的黑箱实现。在这个实现里,聚集类ConcreteAggregate含有一个内部成员类ConcreteIterator,也就是实现了抽象迭代子接口的具体迭代子类,同时聚集并不向外界提供访问自己内部元素的方法。
aaarticlea/png;base64,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" alt="" />
源代码
抽象聚集角色类,这个角色规定出所有的具体聚集必须实现的接口。迭代子模式要求聚集对象必须有一个工厂方法,也就是createIterator()方法,以向外界提供迭代子对象的实例。
public abstract class Aggregate {
/**
* 工厂方法,创建相应迭代子对象的接口
*/
public abstract Iterator createIterator();
}
抽象迭代子角色类
public interface Iterator {
/**
* 迭代方法:移动到第一个元素
*/
public void first();
/**
* 迭代方法:移动到下一个元素
*/
public void next();
/**
* 迭代方法:是否为最后一个元素
*/
public boolean isDone();
/**
* 迭代方法:返还当前元素
*/
public Object currentItem();
}
具体聚集角色类,实现了抽象聚集角色所要求的接口,也就是createIterator()方法。此外,聚集类有一个内部成员类ConcreteIterator,这个内部类实现了抽象迭代子角色所规定的接口;而工厂方法createIterator()所返还的就是这个内部成员类的实例。
public class ConcreteAggregate extends Aggregate { private Object[] objArray = null;
/**
* 构造方法,传入聚合对象的具体内容
*/
public ConcreteAggregate(Object[] objArray){
this.objArray = objArray;
} @Override
public Iterator createIterator() { return new ConcreteIterator();
}
/**
* 内部成员类,具体迭代子类
*/
private class ConcreteIterator implements Iterator
{
//内部索引,记录当前迭代到的索引位置
private int index = 0;
//记录当前聚集对象的大小
private int size = 0;
/**
* 构造函数
*/
public ConcreteIterator(){ this.size = objArray.length;
index = 0;
}
/**
* 迭代方法:返还当前元素
*/
@Override
public Object currentItem() {
return objArray[index];
}
/**
* 迭代方法:移动到第一个元素
*/
@Override
public void first() { index = 0;
}
/**
* 迭代方法:是否为最后一个元素
*/
@Override
public boolean isDone() {
return (index >= size);
}
/**
* 迭代方法:移动到下一个元素
*/
@Override
public void next() { if(index < size)
{
index ++;
}
}
}
}
客户端类
public class Client { public void operation(){
Object[] objArray = {"One","Two","Three","Four","Five","Six"};
//创建聚合对象
Aggregate agg = new ConcreteAggregate(objArray);
//循环输出聚合对象中的值
Iterator it = agg.createIterator();
while(!it.isDone()){
System.out.println(it.currentItem());
it.next();
}
}
public static void main(String[] args) { Client client = new Client();
client.operation();
} }
上面的例子首先创建了一个聚集类实例,然后调用聚集对象的工厂方法createIterator()以得到一个迭代子对象。在得到迭代子的实例后,客户端开始迭代过程,打印出所有的聚集元素。
主动迭代子和被动迭代子
主动迭代子和被动迭代子又称作外部迭代子和内部迭代子。
所谓主动(外部)迭代子,指的是由客户端来控制迭代下一个元素的步骤,客户端会明显调用迭代子的next()等迭代方法,在遍历过程中向前进行。
所谓被动(内部)迭代子,指的是由迭代子自己来控制迭代下一个元素的步骤。因此,如果想要在迭代的过程中完成工作的话,客户端就需要把操作传递给迭代子,迭代子在迭代的时候会在每个元素上执行这个操作,类似于JAVA的回调机制。
总体来说外部迭代器比内部迭代器要灵活一些,因此我们常见的实现多属于主动迭代子。
静态迭代子和动态迭代子
● 静态迭代子由聚集对象创建,并持有聚集对象的一份快照(snapshot),在产生后这个快照的内容就不再变化。客户端可以继续修改原聚集的内容,但是迭代子对象不会反映出聚集的新变化。
静态迭代子的好处是它的安全性和简易性,换言之,静态迭代子易于实现,不容易出现错误。但是由于静态迭代子将原聚集复制了一份,因此它的短处是对时间和内存资源的消耗。
● 动态迭代子则与静态迭代子完全相反,在迭代子被产生之后,迭代子保持着对聚集元素的引用,因此,任何对原聚集内容的修改都会在迭代子对象上反映出来。
完整的动态迭代子不容易实现,但是简化的动态迭代子并不难实现。大多数JAVA设计师遇到的迭代子都是这种简化的动态迭代子。为了说明什么是简化的动态迭代子,首先需要介绍一个新的概念:Fail Fast。
Fail Fast
如果一个算法开始之后,它的运算环境发生变化,使得算法无法进行必需的调整时,这个算法就应当立即发出故障信号。这就是Fail Fast的含义。
如果聚集对象的元素在一个动态迭代子的迭代过程中发生变化时,迭代过程会受到影响而变得不能自恰。这时候,迭代子就应当立即抛出一个异常。这种迭代子就是实现了Fail Fast功能的迭代子。
Fail Fast在JAVA聚集中的使用
JAVA语言以接口java.util.Iterator的方式支持迭代子模式,Collection接口要求提供iterator()方法,此方法在调用时返还一个Iterator类型的对象。而作为Collection接口的子类型,AbstractList类的内部成员类Itr便是实现Iterator接口的类。
Itr类的源代码如下所示
private class Itr implements Iterator<E> {
/**
* Index of element to be returned by subsequent call to next.
*/
int cursor = 0; /**
* Index of element returned by most recent call to next or
* previous. Reset to -1 if this element is deleted by a call
* to remove.
*/
int lastRet = -1; /**
* The modCount value that the iterator believes that the backing
* List should have. If this expectation is violated, the iterator
* has detected concurrent modification.
*/
int expectedModCount = modCount; public boolean hasNext() {
return cursor != size();
} public E next() {
checkForComodification();
try {
E next = get(cursor);
lastRet = cursor++;
return next;
} catch (IndexOutOfBoundsException e) {
checkForComodification();
throw new NoSuchElementException();
}
} public void remove() {
if (lastRet == -1)
throw new IllegalStateException();
checkForComodification(); try {
AbstractList.this.remove(lastRet);
if (lastRet < cursor)
cursor--;
lastRet = -1;
expectedModCount = modCount;
} catch (IndexOutOfBoundsException e) {
throw new ConcurrentModificationException();
}
} final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
}
从Itr类的源代码中可以看到,方法checkForComodification()会检查聚集的内容是否刚刚被外界直接修改过(不是通过迭代子提供的方法修改的)。如果在迭代开始后,聚集的内容被外界绕过迭代子对象而直接修改的话,这个方法会立即抛出ConcurrentModificationException()异常。
这就是说,AbstractList.Itr迭代子是一个Fail Fast的迭代子。
迭代子模式的优点
(1)迭代子模式简化了聚集的接口。迭代子具备了一个遍历接口,这样聚集的接口就不必具备遍历接口。
(2)每一个聚集对象都可以有一个或多个迭代子对象,每一个迭代子的迭代状态可以是彼此独立的。因此,一个聚集对象可以同时有几个迭代在进行之中。
(3)由于遍历算法被封装在迭代子角色里面,因此迭代的算法可以独立于聚集角色变化。
《JAVA与模式》之迭代子模式的更多相关文章
- Java设计模式(18)——行为模式之迭代子模式(Iterator)
一.概述 概念 UML简图 // Aggregate:聚集(集合) 角色 抽象迭代子:定义遍历元素所需要的接口 具体迭代子:实现抽象迭代子接口,保持游标 聚集/具体聚集:定义/实现创建迭代子对象的接口 ...
- 设计模式《JAVA与模式》之迭代子模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述迭代子(Iterator)模式的: 迭代子模式又叫游标(Cursor)模式,是对象的行为模式.迭代子模式可以顺序地访问一个聚集中的元素而不 ...
- JAVA设计模式之迭代子模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述迭代子(Iterator)模式的: 迭代子模式又叫游标(Cursor)模式,是对象的行为模式.迭代子模式可以顺序地访问一个聚集中的元素而不 ...
- [工作中的设计模式]迭代子模式Iterator
一.模式解析 迭代子模式又叫游标(Cursor)模式,是对象的行为模式.迭代子模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象 1.迭代子模式一般用于对集合框架的访问,常用的集合框架为lis ...
- 《java与模式》阅读笔记01
这次我读了前两章的内容,就如书名所言,这本书主要将的就是java中的模式,在书中的序言就把所有的模式都介绍了一下,主要有, 1.创建模式:简单工厂模式,工厂方法模式,抽象工厂模式,建造模式 2.行为模 ...
- 设计模式《JAVA与模式》之备忘录模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述备忘录(Memento)模式的: 备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是对象的行为模式. 备忘录 ...
- 《JAVA与模式》之备忘录模式
一.备忘录(Memento)模式结构 备忘录对象是一个用来存储另外一个对象内部状态的快照(snapshot)的对象.备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捕捉住,并外部化,存储起来, ...
- [设计模式]迭代子模式 Iterator
迭代子模式又叫做游标cursor模式,是对象的行为模式.迭代子模式可以顺序的访问一个聚集中的元素而不必暴露聚集的内部表象. 迭代子模式被广泛的应用在Java语言的API中的几个设计模式之一.在Java ...
- java设计模式8.迭代子模式、责任链模式、命令模式
迭代子模式 迭代子模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象.它将迭代逻辑封装到一个独立的迭代子对象中,从而与聚集本身分开.迭代子对象是对遍历的抽象化,不同的聚集对象可以提供相同的迭代 ...
随机推荐
- 【数学】codeforces C. Maximal GCD
http://codeforces.com/contest/803/problem/C [题意] 给定两个数n,k(1 ≤ n, k ≤ 10^10) 要你输出k个数,满足以下条件: ①这k个数之和等 ...
- msp430项目编程32
msp430中项目---电阻测量系统32 Ad 1.电路工作原理 2.代码(显示部分) 3.代码(功能实现) 4.项目总结
- Hibernate学习笔记(三)
我是从b站视频上学习的hibernate框架,其中有很多和当前版本不符合之处,我在笔记中进行了修改以下是b站视频地址:https://www.bilibili.com/video/av14626440 ...
- 【转载】epoll与select/poll的区别总结
因为这道题目经常被问到.干脆总结一下,免得遗漏了. 参考文章:http://www.cnblogs.com/qiaoconglovelife/p/5735936.html 1 本质上都是同步I/O 三 ...
- 【c++】C++中const用法总结
1. const常量,如const int max = 100; 优点:const常量有数据类型,而宏常量没有数据类型.编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全 ...
- 2003 -Can't connection to mysql server on | navicat for mysql Access denied for user 'root'@''ip'(using password :yes)
用本机windows上的Navicat for mysql链接虚拟机Linux的mysql数据库时,第一次连接的时候报的错误是 2003 -Can't connection to mysql serv ...
- HDU3926Hand in Hand(搜索 或 并查集)
Problem Description In order to get rid of Conan, Kaitou KID disguises himself as a teacher in the k ...
- 使用MySQL Workbench进行数据库设计——MySQL Workbench用法总结
转载请注明出处:http://blog.csdn.net/dongdong9223/article/details/48318877 本文出自[我是干勾鱼的博客] 1 简单介绍 MySQL Workb ...
- JMeter 系列之—-01使用
用Jmeter 做压测,总体与LoadRunner 类似: 一.线程组 1. 线程数 2. 循环次数 单个线程循环次数 3. Ramp-up Period(in seconds) [1]决定多长时间启 ...
- ASP.NET MVC 学习笔记-2.Razor语法 ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础 反射的具体应用 策略模式的具体应用 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用 C#读取XML文件的基类实现
ASP.NET MVC 学习笔记-2.Razor语法 1. 表达式 表达式必须跟在“@”符号之后, 2. 代码块 代码块必须位于“@{}”中,并且每行代码必须以“: ...