Iterator pattern 及其在java API中的运用
1.问题:
当我们看到java中的Collection,List,Set,Map等集合类时都可以用Iterator进行遍历元素时,我们是否感到很神奇。我们不禁要问java是如何实现这一目标的。这就是我今天要谈的话题。
根据Iterator pattern模式我把java中的集合类分为四类:即:
Iterator(抽象迭代器对应于java中的Iterator,其实java这个Iterator还有抽象聚合的功能,因为它实现了Iterable这个接口,而Iterable这个接口就是个抽象聚合类。), concreteIterator(对应与Collection,Map两个大类,及其这两个大类所对应的子类。)
Aggregate(抽象聚合,对应于java中的Iterable这个接口,其实质它是一个工厂类,生产Iterator的工厂)
ConcreterAggregate(具体聚合,实现Aggregate的类。这个类里面有聚集的对象,如何得到聚集元素,以及聚集对象的个数)
2.简要介绍一下:Iterator Patten
通过上面对java集合类的分类,我们可以很容易知道Iterator pattern 模式的角色有:Iterator 、concreteIterator、 Aggregate、 ConcreteAggregate、Client(相当于一个测试类。)
Iterator类的代码如下:
package com.qls.IteratorPattern2;
public interface Iterator {
void first();//第一个元素
void next();//下一个元素
boolean isDone();//是否到最后一个元素
Object currentItem();//返回当前元素
}
ConcreteIterator类的代码如下:
package com.qls.IteratorPattern2;
public class ConcreteIterator implements Iterator {
private int index;
private int size;
private ConcreteAggregate concreteAggregate;
public ConcreteIterator(ConcreteAggregate concreteAggregate) {
this.concreteAggregate=concreteAggregate;
size=concreteAggregate.size();
index=0;
}
@Override
public void first() {
// TODO Auto-generated method stub
index=0;
}
@Override
public void next() {
// TODO Auto-generated method stub
if(index<size){
index++;
}
}
@Override
public boolean isDone() {
// TODO Auto-generated method stub
return index>=size;
}
@Override
public Object currentItem() {
// TODO Auto-generated method stub
return concreteAggregate.getElement(index);
}
}
Aggregate的代码如下:
package com.qls.IteratorPattern2;
public interface Aggregate {
Iterator createIterator();
}
ConcreteAggregate的代码如下:
package com.qls.IteratorPattern2;
public class ConcreteAggregate implements Aggregate {
//聚集对象
private Object[] obj={"1","2","3","4","5","6"};
@Override
public Iterator createIterator() {
// TODO Auto-generated method stub
return new ConcreteIterator(this);//this代表:ConcreteAggregate
}
/**
* 返回聚集的大小。
* @return
*/
public int size(){
return obj.length;
}
/**
* 得到聚集元素
* @param index 聚集元素所对应的下标。
*/
public Object getElement(int index){
if(index<obj.length){
return obj[index];
}else{
return null;
}
}
}
Client的代码如下:
package com.qls.IteratorPattern2;
/**
* 把聚集元素打印出来。
* @author 秦林森
*
*/
public class Client {
private ConcreteAggregate concreteAggregate=new ConcreteAggregate();
private Iterator it;
public void operation(){
it = concreteAggregate.createIterator();
while(!it.isDone()){
System.out.println(it.currentItem());
it.next();
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new Client().operation();
}
}
3.总结:
通过对Iterator pattern 的简单认识,可以消除我们对迭代器的神秘感,它的实现只不过是:在Aggregate类中有一个createIterator()方法,用以产生Iterator。把聚聚对象的
元素交给这个Iterator。上述例子中的聚集对象时一个Object[]的数组。
Iterator pattern 及其在java API中的运用的更多相关文章
- Java基础学习总结(67)——Java接口API中使用数组的缺陷
如果你发现在一个接口使用有如下定义方法: public String[] getParameters(); 那么你应该认真反思.数组不仅仅老式,而且我们有合理的理由避免暴露它们.在这篇文章中,我将试图 ...
- RabbitMQ的Java API编程
1.创建Maven工程,pom.xml引入依赖: <dependency> <groupId>com.rabbitmq</groupId> <artifact ...
- Java api 入门教程 之 JAVA的Random类
在实际的项目开发过程中,经常需要产生一些随机数值,例如网站登录中的校验数字等,或者需要以一定的几率实现某种效果,例如游戏程序中的物品掉落等. 在Java API中,在java.util包中专门提供了一 ...
- mybatis Java API
既然你已经知道如何配置 MyBatis 和创建映射文件,你就已经准备好来提升技能了. MyBatis 的 Java API 就是你收获你所做的努力的地方.正如你即将看到的,和 JDBC 相比, MyB ...
- 9. 使用ZooKeeper Java API编程
ZooKeeper是用Java开发的,3.4.6版本的Java API文档可以在http://zookeeper.apache.org/doc/r3.4.6/api/index.html上找到. Ti ...
- Java数据持久层框架 MyBatis之API学习八(Java API详解)
对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...
- MyBatis——Java API
Java API 既然你已经知道如何配置 MyBatis 和创建映射文件,你就已经准备好来提升技能了. MyBatis 的 Java API 就是你收获你所做的努力的地方.正如你即将看到的,和 JDB ...
- kafka java API的使用
Kafka包含四种核心的API: 1.Producer API支持应用将数据流发送到Kafka集群的主题 2.Consumer API支持应用从Kafka集群的主题中读取数据流 3.Streams A ...
- 迭代器模式在 Java 容器中的实现
迭代器接口是迭代器模式实现的精髓: public interface Iterator<E> { boolean hasNext(); E next(); ... } 假设某容器名为 Xx ...
随机推荐
- php正则 与 js正则
PHP中的正则表达式函数 在PHP中有两套正则表达式函数库.一套是由PCRE(Perl Compatible Regular Expression)库提供的.PCRE库使用和Perl相同的语法规则实现 ...
- Python常用函数记录
Python常用函数/方法记录 一. Python的random模块: 导入模块: import random 1. random()方法: 如上如可知该函数返回一个[0,1)(左闭右开)的一个随机的 ...
- manjaro安装teamviewer后无法打开
点桌面快捷方式一闪而过 命令行运行提示 $ teamviewer /opt/teamviewer/tv_bin/script/tvw_exec:行7: /opt/teamviewer/logfiles ...
- linux-shell——03
mkdir 创建一个新目录格式: mkdir [选项-p][路径]目录名 -p 递归创建多级目录 mkdir -p b/c/e/f/g rmdir 删除一个空目录 touch 创建一个空文件,更新文件 ...
- 中国剩余定理算法详解 + POJ 1006 Biorhythms 生理周期
转载请注明出处:http://exp-blog.com/2018/06/24/pid-1054/ #include <iostream> #include <cstdio> u ...
- CF797E. Array Queries
a is an array of n positive integers, all of which are not greater than n. You have to process q que ...
- ABAP CDS - SELECT, WHERE
格式 ... WHERE cond_expr ... 结果 定义CDS视图结果集的Where条件.访问CDS视图时,结果集仅包含来自数据源数据源的数据,该数据源数据源满足在where之后指定的条件co ...
- 購買管理(MM)
■購買管理■ [購買伝票]EKKO: ヘッダ EKPO: 明細 EKET: 納入日程行 EKPA: 取引先機能 EKKN: 勘定設定 EKBE: 後続伝票 EKBEH: 削除済み後続伝票履歴 [請求書 ...
- IIS发布错误记录
1.HTTP 错误 500.19 - Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效. 详细错误信息模块 IIS Web Core 通知 BeginRequ ...
- HTML中body相关标签-02
今日内容: 字体标签: h1~h6.<font>.<u>.<b>.<strong><em>.<sup>.<sub> ...