- 浏览: 327080 次
- 性别:
- 来自: 广州
文章分类
最新评论
迭代子Iterator模式又叫做游标模式,是对象的行为模式,迭代子模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表像.
Java聚集(Collection)对象是实现了共同的java.util.Collection接口的对象,从1.2版本开始,Java语言提供了很多种聚集,包括Vector,ArrayList,Queue,Stack,TreeSet,HashMap,TreeMap...那么为什么聚集需要迭代子??聚集对象必须提供适当的方法,允许客户端能够按照一个线性顺序遍历所有的元素对象,把一个元素对象提取出来或者删除掉,一个使用聚集的系统必然会使用这些方法操控聚集对象,回而在使用聚集的系统深化过程中,会出现两类问题:
(1)迭代逻辑没变,但是需要将一种聚集换成另一种聚集时,由于不同的聚集有不同的接口,所以要修改客户端代码
(2)聚集不会改变,但是迭代的方式需要改变。比如原来只有读取和删除元素,而现在要对元素进行过滤,这时就只好修改聚集对象,修改已有的遍历方法...造成这样的原因,是因为没有将不变的结构从系统中抽象出来与可变成分分割,并将可变部分的各种实现封装起来.迭代子模式把迭代逻辑封装到一个独立的迭代子对象中,从而与聚集本身分割开。迭代子对象是对遍历的抽象化,不同的聚集对象可以提供相同的迭代子对象,从而使客户端无需知道聚集的底层结构,一个聚集可以提供多个不同的迭代子对象,从而使得遍历逻辑的变化不会影响到聚集对象本身.
再论“开闭”原则:开闭原则要求系统可以在不修改已有代码的情况下进行功能的扩展,做到这一点的途径就是对变化的封装
(1)从对变化的封装角度讲,迭代子模式将访问聚集元素的逻辑封装起来,并且使它独立于聚集对象的封装,这就提供了聚集存储逻辑与迭代逻辑独立演变的空间,增加了系统的可复用性..
(2)从代码的重构角度上讲,迭代子在客户端和聚集之间增加了一个中介层,从而使得客户端与聚集之间的通信从直接变成间接,这样做的好处就是缓冲了客户端的对聚集的影响,以及聚集的变化对客户端的影响.
迭代子模式涉及到以下几个角色:
(1)抽象迭代子(Iterator)角色:此抽象角色定义出遍历元素所需要的接口.
(2)具体迭代子(ConcreteIterator)角色:此角色实现了Iterator接口,并保持迭代过程中的游标位置.
(3)聚集(Aggregate)角色:此抽象角色给出创建迭代子(Iterator)对象的接口.
(4)具体聚集(ConcreteAggregate)角色:实现了创建迭代子(Iterator)对象的接口,返回一个合适的具体迭代子实例
(5)客户端(Client)角色:持有对聚集及其迭代子对象的引用,调用迭代子对象的迭代接口,也有可能通过迭代子操作聚集元素的增加和删除.
示意源码如下:
Java聚集(Collection)对象是实现了共同的java.util.Collection接口的对象,从1.2版本开始,Java语言提供了很多种聚集,包括Vector,ArrayList,Queue,Stack,TreeSet,HashMap,TreeMap...那么为什么聚集需要迭代子??聚集对象必须提供适当的方法,允许客户端能够按照一个线性顺序遍历所有的元素对象,把一个元素对象提取出来或者删除掉,一个使用聚集的系统必然会使用这些方法操控聚集对象,回而在使用聚集的系统深化过程中,会出现两类问题:
(1)迭代逻辑没变,但是需要将一种聚集换成另一种聚集时,由于不同的聚集有不同的接口,所以要修改客户端代码
(2)聚集不会改变,但是迭代的方式需要改变。比如原来只有读取和删除元素,而现在要对元素进行过滤,这时就只好修改聚集对象,修改已有的遍历方法...造成这样的原因,是因为没有将不变的结构从系统中抽象出来与可变成分分割,并将可变部分的各种实现封装起来.迭代子模式把迭代逻辑封装到一个独立的迭代子对象中,从而与聚集本身分割开。迭代子对象是对遍历的抽象化,不同的聚集对象可以提供相同的迭代子对象,从而使客户端无需知道聚集的底层结构,一个聚集可以提供多个不同的迭代子对象,从而使得遍历逻辑的变化不会影响到聚集对象本身.
再论“开闭”原则:开闭原则要求系统可以在不修改已有代码的情况下进行功能的扩展,做到这一点的途径就是对变化的封装
(1)从对变化的封装角度讲,迭代子模式将访问聚集元素的逻辑封装起来,并且使它独立于聚集对象的封装,这就提供了聚集存储逻辑与迭代逻辑独立演变的空间,增加了系统的可复用性..
(2)从代码的重构角度上讲,迭代子在客户端和聚集之间增加了一个中介层,从而使得客户端与聚集之间的通信从直接变成间接,这样做的好处就是缓冲了客户端的对聚集的影响,以及聚集的变化对客户端的影响.
迭代子模式涉及到以下几个角色:
(1)抽象迭代子(Iterator)角色:此抽象角色定义出遍历元素所需要的接口.
(2)具体迭代子(ConcreteIterator)角色:此角色实现了Iterator接口,并保持迭代过程中的游标位置.
(3)聚集(Aggregate)角色:此抽象角色给出创建迭代子(Iterator)对象的接口.
(4)具体聚集(ConcreteAggregate)角色:实现了创建迭代子(Iterator)对象的接口,返回一个合适的具体迭代子实例
(5)客户端(Client)角色:持有对聚集及其迭代子对象的引用,调用迭代子对象的迭代接口,也有可能通过迭代子操作聚集元素的增加和删除.
示意源码如下:
package cai.milenfan.basic.test; /*抽象聚集角色,规定所有的个体聚集必须实现的接口 */ abstract public class Aggregate { public Iterator createIterator(){ return null; } }
package cai.milenfan.basic.test; /* *抽象迭代子角色声明了具体迭代子需要实现的接口 */ public interface Iterator { void first(); void next(); boolean isDone(); Object currentItem(); }
package cai.milenfan.basic.test; public class ConcreteAggregate extends Aggregate{ private Object objs[]= {"Monk Tang", "Monkey", "Pigsy", "Sandy", "Horse"}; public Iterator createIterator(){ return (Iterator) new ConcreteIterator(this); } public Object getElement(int index){ if (index < objs.length) { return objs[index]; } else { return null; } } public int size(){ return objs.length; } }
package cai.milenfan.basic.test; public class ConcreteIterator implements Iterator{ private ConcreteAggregate agg; private int index = 0; private int size = 0; public ConcreteIterator(ConcreteAggregate agg){ this.agg = agg; size = agg.size(); index = 0 ; } public void first(){ index = 0 ; } public void next(){ if (index < size){ index ; } } public boolean isDone(){ return (index >= size); } public Object currentItem(){ return agg.getElement(index); } }
package cai.milenfan.basic.test; public class Client{ private Iterator it; private Aggregate agg = new ConcreteAggregate(); public void operation(){ it = agg.createIterator(); while( !it.isDone() ){ System.out.println(it.currentItem().toString()); it.next(); } } public static void main(String[] args){ Client client = new Client(); client.operation(); } }
package cai.milenfan.basic.test; public class Client{ private Iterator it; private Aggregate agg = new ConcreteAggregate(); public void operation(){ it = agg.createIterator(); while( !it.isDone() ){ System.out.println(it.currentItem().toString()); it.next(); } } public static void main(String[] args){ Client client = new Client(); client.operation(); } }
发表评论
-
Mina重连
2014-05-26 21:29 2859import com.sun.swing.internal. ... -
面试经典
2014-05-24 09:29 6041.mysql innodb引擎,什么叫聚集索引,与非聚集索 ... -
一拍网网站系统架构图
2014-03-28 21:24 530一拍网网站系统架构图 -
Window下安装配置nginx
2013-08-12 16:53 730安装:http://www.cnblogs.com/wen ... -
使用线程池的好处
2013-07-18 14:41 1134使用线程池有两个好处: 1.可以创建和销毁线程所带来的系统 ... -
Java ThreadLocal使用浅析
2013-07-18 14:36 411ThreadLocal通过在其内部保存变量的副本,并且各个副本 ... -
MyBatis学习之简单增删改查操作、MyBatis存储过程、MyBatis分页、MyBatis一对一、MyBatis一对多
2013-07-05 13:06 1082http://blog.csdn.net/zhangwei ... -
分享一位网友的架构杂谈
2013-05-20 23:16 867不容类型的网站,并发处理不一样,例如针对sns这种类型的网站 ... -
JSP页面静态化
2013-04-08 09:20 798http://www.java-zone.org/644.ht ... -
Java compile to C++
2013-03-19 14:53 459http://code.google.com/a/eclips ... -
几个TCP Socket的通信框架
2013-03-19 12:26 941http://www.oschina.net/p/simple ... -
宝贝鱼
2013-03-18 23:54 630http://code.google.com/p/cshbbr ... -
将Java程序注册成系统服务(NT服务)
2013-03-16 16:14 567http://blog.csdn.net/small____f ... -
Java内存回收机制
2013-03-13 15:47 776http://www.iteye.com/blogs/tag/ ... -
支付宝,百付宝集成
2013-03-13 14:01 892http://help.alipay.com/support/ ... -
SSH+EXTJS项目下载
2013-03-11 23:02 384http://download.csdn.net/tag/Ex ... -
Hibernate中使用Threadlocal创建线程安全的Session
2013-03-04 20:39 487http://blog.sina.com.cn/s/blog_ ... -
Java Socket多线程通信
2012-10-09 09:53 808当Server没接受到一个Client连接请求之后,都把处理流 ... -
Java 多线程的一个例子
2012-10-09 09:48 982目录: 1 synchronized的 ... -
app引擎
2012-07-10 09:39 0http://sae.sina.com.cn/ htt ...
相关推荐
IteratorPattern 迭代设计模式
下面我们先简单讨论一个根接口Collection,然后分析一个抽象类AbstractList和它的对应Iterator接口,并仔细研究迭代子模式的实现原理。 本文讨论的源代码版本是JDK 1.4.2,因为JDK 1.5在java.util中使用了很多泛型...
源代码(eclipse直接打开) 博文链接:https://futrueboy.iteye.com/blog/382010
Java与模式:迭代子(Iterator)模式、合成(Composite)模式、抽象工厂模式等
迭代子模式( Iterator ) 责任链模式( Chain of Responsibility ) 命令模式( Command ) 备忘录模式( Memento ) 状态模式( State ) 访问者模式( Visitor ) 中介者模式( Mediator ) 解释器模式( ...
BinaryIterator:此迭代器由具有两个子代(例如运算符)的表达式树类创建,并在每次迭代中返回其中一个子代 UnaryIterator:此迭代器由具有一个子级(例如装饰器)的表达式树类创建,并在其第一次迭代时返回唯一的...
迭代子模式( Iterator ) 责任链模式( Chain of Responsibility ) 命令模式( Command ) 备忘录模式( Memento ) 状态模式( State ) 访问者模式( Visitor ) 中介者模式( Mediator ) 解释器模式( ...
迭代子模式( Iterator ) 责任链模式( Chain of Responsibility ) 命令模式( Command ) 备忘录模式( Memento ) 状态模式( State ) 访问者模式( Visitor ) 中介者模式( Mediator ) 解释器模式( ...
迭代器模式(Iterator Pattern)是一种非常常用的设计模式,这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。迭代器模式属于行为型模式。 介绍 意图: 提供一种方法顺序访问一个聚合对象中各个...
迭代子模式( Iterator ) 责任链模式( Chain of Responsibility ) 命令模式( Command ) 备忘录模式( Memento ) 状态模式( State ) 访问者模式( Visitor ) 中介者模式( Mediator ) 解释器模式( ...
迭代子模式( Iterator ) 责任链模式( Chain of Responsibility ) 命令模式( Command ) 备忘录模式( Memento ) 状态模式( State ) 访问者模式( Visitor ) 中介者模式( Mediator ) 解释器模式( ...
com.javapatterns.iterator 迭代子模式 com.javapatterns.javaio 专题:设计模式在Java I/O中的应用 com.javapatterns.keygen 专题:序列键生成器与单例及多例模式 com.javapatterns.liskov 里氏代换原则 ...
迭代子模式( Iterator ) 责任链模式( Chain of Responsibility ) 命令模式( Command ) 备忘录模式( Memento ) 状态模式( State ) 访问者模式( Visitor ) 中介者模式( Mediator ) 解释器模式( ...
迭代子模式( Iterator ) 责任链模式( Chain of Responsibility ) 命令模式( Command ) 备忘录模式( Memento ) 状态模式( State ) 访问者模式( Visitor ) 中介者模式( Mediator ) 解释器模式( ...
迭代子模式( Iterator ) 责任链模式( Chain of Responsibility ) 命令模式( Command ) 备忘录模式( Memento ) 状态模式( State ) 访问者模式( Visitor ) 中介者模式( Mediator ) 解释器模式( ...
迭代子模式( Iterator ) 责任链模式( Chain of Responsibility ) 命令模式( Command ) 备忘录模式( Memento ) 状态模式( State ) 访问者模式( Visitor ) 中介者模式( Mediator ) 解释器模式( ...
迭代子模式( Iterator ) 责任链模式( Chain of Responsibility ) 命令模式( Command ) 备忘录模式( Memento ) 状态模式( State ) 访问者模式( Visitor ) 中介者模式( Mediator ) 解释器模式( ...
迭代子模式( Iterator ) 责任链模式( Chain of Responsibility ) 命令模式( Command ) 备忘录模式( Memento ) 状态模式( State ) 访问者模式( Visitor ) 中介者模式( Mediator ) 解释器模式( ...
迭代子模式( Iterator ) 责任链模式( Chain of Responsibility ) 命令模式( Command ) 备忘录模式( Memento ) 状态模式( State ) 访问者模式( Visitor ) 中介者模式( Mediator ) 解释器模式( ...
迭代子模式( Iterator ) 责任链模式( Chain of Responsibility ) 命令模式( Command ) 备忘录模式( Memento ) 状态模式( State ) 访问者模式( Visitor ) 中介者模式( Mediator ) 解释器模式( ...