您的位置:首页 > 其它

设计模式(8) - 迭代器模式(iterator)- 实现ArrayList和linkedList的迭代器

2017-04-20 10:59 330 查看
上周六就開始写这篇博客,之后一直耽误了。到前天才開始写。今天醒的早,就把这部分整理一下。

本文内容參考易学设计模式和马士兵的迭代器模式的视频。

了解迭代器模式一个作用就是让你在使用 迭代器遍历集合类的时候 认为更自然。'

一 、迭代器模式简单介绍

【定义】 跌倒器模式提供一种顺序訪问一个聚合对象中各个元素,而又不暴露该对象的内部表示的方法。

【原理】 主要4部分组成:迭代器角色、详细迭代器角色、容器角色和详细容器角色。

【使用时机】当訪问一个聚合对象的内容而无需暴露它的内部表示,或者须要支持对集合对象的多种遍历。或者为

遍历不同的聚合结构提供一个统一的接口时,就能够考虑是用迭代器模式。

二 、实现ArrayList和linkedList的迭代器

这里仅仅是简单实现,详细的能够看看源代码。记得csdn中有一个 兰亭风雨 的博客写有集合类源代码解析的文章。

上代码:

Iterator.java

package com.chan;

public interface Iterator {

Object next();
boolean hasNext();
}

Collection.java

package com.chan;

public interface Collection {

void add(Object obj);
int size();
Iterator iterator();
}

Node,java

package com.chan;

public class Node {

private Object data;
private Node next;

public Node(Object data, Node next) {
super();
this.data = data;
this.next = next;
}

public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}

}

ArrayList.java

package com.chan;
public class ArrayList implements Collection {

Object[] objects = new Object[10];
int index = 0;
public void add(Object o) {
if(index == objects.length) {
Object[] newObjects = new Object[objects.length * 2];
System.arraycopy(objects, 0, newObjects, 0, objects.length);
objects = newObjects;
}
objects[index] = o;
index ++;
}

public int size() {
return index;
}

public Iterator iterator() {

return new ArrayListIterator();
}

private class ArrayListIterator implements Iterator {
private int currentIndex = 0;

@Override
public boolean hasNext() {
if(currentIndex >= index) return false;
else return true;
}

@Override
public Object next() {
Object o = objects[currentIndex];
currentIndex ++;
return o;
}

}
}

LinkedList.java

package com.chan;

public class LinkedList implements Collection {
Node head = null;
Node tail = null;
int size = 0;
public void add(Object o) {
Node n = new Node(o, null);
if(head == null) {
head = n;
tail = n;
}
tail.setNext(n);
tail = n;
size ++;
}

public int size() {
return size;
}

@Override
public Iterator iterator() {
return new LinkedListIterator();
}

private class LinkedListIterator implements Iterator{

private Node currentNode = head;
private int nextIndex = 0;//參考源代码中的写法

@Override
public Object next() {

Object data = currentNode.getData();
currentNode = currentNode.getNext();
nextIndex ++;
return data;
}

@Override
public boolean hasNext() {

return nextIndex != size;
}

}

}

Test>java

package com.chan;
public class Test {

public static void main(String[] args) {

//Collection c = new ArrayList();
Collection c = new LinkedList();

for(int i=0; i<15; i++){
c.add("test-"+i);
}

System.out.println(c.size());

Iterator it = c.iterator();
while(it.hasNext()) {
Object o = it.next();
System.out.print(o + " ");
}
}
//15
//test-0 test-1 test-2 test-3 test-4 test-5 test-6 test-7 test-8 test-9 test-10 test-11 test-12 test-13 test-14
}


以上代码測试通过。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐