`
Java_Fan
  • 浏览: 73955 次
  • 性别: Icon_minigender_1
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

JAVA迭代器二例

 
阅读更多

第一例:

JAVA之迭代器模式easy come easy go!

引用自 http://blog.csdn.net/feiben007/archive/2007/07/28/1713461.aspx

最近在好好研究设计模式,毕竟自己的程序层次要提高的话要有纵向的扩展!程序的模式就是效仿建筑学方面的设计方法,再结合程序的特点产生出来的。
这里我好好回顾了一下比较常用的模式,把自己的看法写出来以激励自己。
迭代器模式是一种大家经常要用到的模式,在JAVA的Collections中大家可以经常应用
最常见的到的是下面这种程序结构
(Iterator i = Object.hasnext;i.next;)
{
// to do something;
}
在用这个模式的时候,我们通常就调用这里的方法,而不关心它的内部组织过程,所以让我们来看看它的内在东东。
这里我先给出一个例子。

这个例子是我随便想的,说的是一个山上没有任何的树,现在我们要种植几个树,例如 苹果树什么的,然后我要遍历这些树,给每颗树喷洒不同的农药!
在这个例子中我们可以看到,遍历树的话可以用到迭代器模式!

首先我们要做个迭代器接口,为什么要抽象出来一个接口,(这个问题大家自己网上找接口的好处)!

package TreeIterator;
public interface Iterator {
public boolean hasNext();
public Object next();
}
这个接口我们有2个方法,hasNext()是否还有下一条数据,next返回具体的Object 这里也就是树。
我们先不必要忙着做他的实现类,我们现在要来做的是这个容器(不是JAVA中容器,与arraylist什么的无关),正所谓树的容器是什么,是山也!
我们想想山应该具有什么呢!?
首先它要有种植树的功能,这里可以看作添加树。我们可以想像山的功能是和树相互关联的,那么他们之间是什么关系呢,我们给他们一

种聚合的关系,聚合的关系大家可以参考UML图,我在这里给出它的一种程序表现形式。


package TreeIterator;

public class Hall {
Tree[] tree ; //这里可以看作是聚合关系
private int index; //指向Tree[]的标签
public Hall(int maxNumber) {
tree = new Tree[maxNumber];
index = 0;
}
public void add(Tree tree)
{
this.tree[index]=tree;

index++;
}


public Iterator connectIterator()
{
return new TreeIterator(this);
}

}
这里我们定义的山可以抽象出Hall类来,Tree[] tree 可以看作是山和树之间的一种聚合关系。add方法就是添加树。问题来了,山

和树有了关系,那么山和迭代器有什么关系呢。它们之间肯定有一种关系。我们有了这个容器(山),就要把这个容器来实现迭代的方法:hasNext()和Next().恩这里我们可以看

出,山和迭代器之间也是一种关联关系。我们就把它看成是一种聚合关系(TIP:聚合关系一种特殊的关联关系)。我们可以通过一个connectIterator方法来链接山和迭代器,接下来

我们要去做一个具体的迭代类,这个具体的类中间有了hasNext()和Next()的具体实现方法


package TreeIterator;

public class TreeIterator implements Iterator{

private int last=0;
private Hall hall;

public TreeIterator(Hall hall) {
this.hall=hall;
}

public boolean hasNext(){
if(last<hall.tree.length)
return true;
else
return false;
}

public Tree next(){
Tree t = hall.tree[last];
last++;
return t;
}
}
这里Hall hall 就可以看作是一种关联关系,我们要把山和迭代器联系起来就通过构造函数来实现,hasNext和next实现方法就体现出来了
有了山,有了迭代器,可是树还没有定义,不过这个树的方法还很好解决!树不关联其他的事务,我们可以简单的这么写:

package TreeIterator;

public class Tree {
private String name;
public Tree(String name) {
this.name=name;
}
public String getName(){
return this.name;
}
}


好了似乎我们整个工程完工了,我们现在来模拟一下农民老大伯来种树撒肥的过程;
package TreeIterator;

public class Pren {

public Pren() {
}
public static void main(String[] args){
Hall hall = new Hall(4);
hall.add(new Tree("苹果树"));
hall.add(new Tree("梨树"));
hall.add(new Tree("橘子树"));
hall.add(new Tree("凤梨树"));
for(Iterator i = hall. connectIterator();i.hasNext();){
String Type = ((Tree)(i.next())).getName();
if(Type=="苹果树"){
System.out.println("洒苹果树的农药,");
}
if(Type=="梨树"){
System.out.println("洒梨树的农药");
}
if(Type=="橘子树"){
System.out.println("洒橘子树的农药,洒了也没用,还没到成熟日,现在没结果实");
}
if(Type=="凤梨树"){
System.out.println("南风天,湿气大,让它烂在地里吧");
}
}
}
}

农民的英文单词不记得怎么写了,好像记得是P开头的 ,这里就用Pren 来代替了,首先农民老大伯要有种树的地方,也就是山的实例:Hall hall = new Hall(4); 这座山呢只能

种4个树,山小而五脏俱全,更像一个土包,再要有树才行啊 ,所以4个树的实例出现。好了接下来种树,几毫秒解决!山了有我们就要把山放到迭代器中间去了。遍历这个山(容

器)。

联想
我们看看arrayList中的迭代器模式是怎么实现的!
ArrayList a = new ArrayList();
a.add("a1");
a.add("a2");
a.add("a3");
a.add("a4");
for(Iterator i= a.iterator();i.hasNext();)
{
System.out.println(i.next().toString());
}


是不是很多地方和我们地例子相似!

以上呢是我举出的一个例子,不过这个程序还有很多的不完善的地方!标准的设计模式中呢还有一个Aggregae接口,容器还有实现这个接口来获得具体的迭代器!大家可以参考

JAVA设计模式,我这里没有添加这个接口!还有人要问干脆不做个数组就行了吗!?
呵呵 这个问题大家自己考虑,想想为什么要Vector 为什么要ArrayList;

第二例

Java Iterator(迭代器)实现

引用自 http://wen.jianbao.blog.163.com/blog/static/41061444200823012828282/

对于自定义的数据结构来说,如果想使用Iterator(迭代器)来遍历数据,就需要定义自己的Iterator。
下面的例子用数组来存储数据。接口Iterator包含三个方法:hasNext()、next()和remove()。remove()方法是可选的。
importjava.util.*;
publicclassArrayIteratorimplementsIterator{
protectedObject[]data={"one","two","three"};
protectedintindex=0;

publicArrayIterator(Object[]d){
data=d;
}

publicArrayIterator(){
}

publicbooleanhasNext(){
return(index<data.length);
}

publicObjectnext(){//返回数据结构的下一个元素
if(index>=data.length)
thrownewIndexOutOfBoundsException("only"+data.length+"elements");
returndata[index++];
}

publicvoidremove(){//删除当前对象,不支持
thrownewUnsupportedOperationException("Thisdemodoesnotimplementtheremovemethod");
}

publicstaticvoidmain(Stringargs[]){//测试
ArrayIteratorit=newArrayIterator();
while(it.hasNext())
System.out.println(it.next());
}
}

运行结果:
C:/java>javaArrayIterator
one
two
three

分享到:
评论

相关推荐

    Java设计模式之Iterator模式

    2.定义一个Iterator迭代器的接口 3.定义一个ArrayList,实现Collection接口,并写一个实现了Iterator接口的内部类。 4.编写测试程序TestMain 从以上可以看出,设计模式到处用到面向对象中的多态。接口调用子类中的...

    Java新接口,可分迭代器spliterator.pdf

    以数据库的性能为例,但运行环境的任何部分都可能会引起性能问题。 对于整体系统,采取结构化方法针对系统的所有方面分析性能。CPU 使用率、I/O 延迟、系统整体的吞吐量都必须测量和分析。到那时,我们才能判定到底...

    数据结构与算法分析Java语言描述(第二版)

    表、栈和队列3.1 抽象数据类型3.2 表ADT3.2.1 表的简单数组实现3.2.2 简单链表3.3 JavaCollectionsAPI中的表3.3.1 Collection接口3.3.2 Iterator接口3.3.3 List接口、ArrayList类和LinkedList类3.3.4 例:remove...

    Java的23种设计模式疯狂Java总结.doc

    设计模式3 1.1 创立型模式4 1.1.1 工厂方法4 1.1.2 抽象工厂6 1.1.3 建造...迭代器模式45 1.3.5 中介者模式49 1.3.6 备忘录模式52 1.3.7 观察者模式54 1.3.8 状态模式58 1.3.9 策略模式61 1.3.10 模板方法63 1.3.11 者...

    java 面试题 总结

    但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,通常Java Bean还要实现Serializable接口用于实现Bean的持久性。Java Bean实际上相当于微软COM模型中的本地...

    JAVA设计模式.rar

    策略模式【STRATEGY PATTERN】 代理模式【PROXY PATTERN】 单例模式【SINGLETON PATTERN】  多例模式【MULTITION PATTERN】  ...迭代器模式【ITERATOR PATTERN】  组合模式【COMPOSITE PATTERN】 ......

    Java24种设计模式,Java24种设计模式,24种设计模式,学会了这24种设计模式,可以打遍天下无敌手,设计模式非常重要

    14、迭代器模式ITERATOR PATTERN 15、组合模式COMPOSITE PATTERN 16、观察者模式OBSERVER PATTERN 17、责任链模式 18、访问者模式VISITOR PATTERN 19、状态模式 20、原型模式 21、中介者模式 22、解释器模式 23、...

    整理后java开发全套达内学习笔记(含练习)

    Iterator [java] 迭代器, 迭代程序 legal 合法的 ['li:gәl] log n.日志,记录 [lɒg] native (关键字) ?? ['neitiv] nested [java] 嵌套的 ['nestid] '如:内部类(nested classes) Object [java] 对象 ['ɒbdʒ...

    数据结构与算法分析_Java语言描述(第2版)]

    表、栈和队列3.1 抽象数据类型3.2 表ADT3.2.1 表的简单数组实现3.2.2 简单链表3.3 JavaCollectionsAPI中的表3.3.1 Collection接口3.3.2 Iterator接口3.3.3 List接口、ArrayList类和LinkedList类3.3.4 例:remove...

    tictactoeleetcode-JavaPlayground:Java注解、线程使用、设计模式、算法训练等

    迭代器 排序图 堆 归并排序 集合框架 列表示例 设置示例 地图示例 设计模式 桥接模式 工厂设计模式 HackerRank Java 问题 阵列旋转 数谷 重复字符串 向左旋转阵列 袜子商人 二维数组 新年混乱 DNA补体 嗡嗡声 笔记本...

    数据结构与算法分析_Java语言描述(第2版)

    3.4.2 迭代器、Java嵌套类和内部类 3.5 LinkedList类的实现 3.6 栈ADT 3.6.1 栈模型 3.6.2 栈的实现 3.6.3 应用 3.7 队列ADT 3.7.1 队列模型 3.7.2 队列的数组实现 3.7.3 队列的应用 小结 练习 第4章 树 4.1 预备...

    数据结构与算法分析 Java语言描述第2版

    表、栈和队列3.1 抽象数据类型3.2 表ADT3.2.1 表的简单数组实现3.2.2 简单链表3.3 JavaCollectionsAPI中的表3.3.1 Collection接口3.3.2 Iterator接口3.3.3 List接口、ArrayList类和LinkedList类3.3.4 例:remove...

    体系结构学习代码!特别详细丰富

     【例4.1】迭代器模式-矩阵搜索  【例4.2】迭代器模式-产品搜索  【例4.4】访问者模式-名牌鞋销售软件  【例4.5】访问者模式-计算机部件销售软件  【例4.6】命令模式-室内温度控制  【例4.7】命令模式-...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷8

    pattern/src/behavior/strategy //13.1策略模式 pattern/src/behavior/templatemethod //13.2模板方法模式 pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 ...

    eclipsejava源码添加-automatic-java-logger:通过添加日志记录语句,使用EclipseJava抽象语法树(AST

    启动器程序还自动执行所述Java程序的多次迭代,并从配置文件中提取不同的输入,并将日志记录语句写入文件中。 例子 以下是Logger的工作方式示例:原始代码是用户提供的语法正确的代码。 插入代码是使用AST解析插入...

Global site tag (gtag.js) - Google Analytics