设计模式 -- Iterator(迭代器)
2010-10-03 00:09
375 查看
模式用途:设计能装载任意对象的容器,并要求该容器有一个遍历元素的iterator()方法,用来遍历容器中的每个元素。
设计一个容器的接口,用来定义这些”能装载任意对象的容器”的方法,从而在使用这些容器的时候可以更加灵活,更换起来只需要更改装载的容器的类型即可,其他方法都不用改变。
Ø 接口Collection.java
package com.yilong.designpattern.iterator;
public interface Collection {
public void add(Object obj);
public int size();
public Iterator iterator();
}
Ø 实现了Collection接口的ArrayList.java
package com.yilong.designpattern.iterator;
public class ArrayList implements Collection {
Object[] objs = new Object[10];
int index = 0;
public void add(Object obj) {
if(index == objs.length) {
Object[] newObjs = new Object[objs.length * 2];
System.arraycopy(objs, 0, newObjs, 0, objs.length);
objs = newObjs;
}
objs[index] = obj;
index ++;
}
public Iterator iterator() {
return new ArrayIterator(this);
}
public int size() {
return index;
}
public Object get(int i) {
return objs[i];
}
}
说明:System.arraycopy(objs, 0, newObjs, 0, objs.length);表示把objs数组中索引为0-objs.length的元素复制到数组newObjs中,第一个0表示从newObjs的0位置开始复制。
容器的iterator()方法会调用适合本身容器进行遍历的迭代器Iterator。
还需要注意的一点是get(int i)方法不要放在Collection接口的方法定义中,因为Collection接口已经有iterator()方法足以遍历容器中元素了, 可见get(int i)方法并不是每种容器都必须的,因此更加适合于只定义在具体的容器中。
Ø 迭代器接口Iterator.java
package com.yilong.designpattern.iterator;
public interface Iterator {
public boolean hasNext();
public Object next();
}
说明:该接口主要有两个方法,一个是判断容器中是否还有下一个元素的hasNext(),另一个是取出容器中下一个元素next()方法。
Ø 实现了Iterator接口的ArrayIterator.java
package com.yilong.designpattern.iterator;
public class ArrayIterator implements Iterator{
private ArrayList arrayList;
private int index = 0;
ArrayIterator(ArrayList arrayList) {
this.arrayList = arrayList;
}
public boolean hasNext() {
if(this.index < this.arrayList.size()) {
return true;
} else {
return false;
}
}
public Object next() {
Object obj = arrayList.get(this.index);
this.index ++;
return obj;
}
}
说明:主要用以对ArrayList容器进行遍历的iterator类。
Ø Book.java
package com.yilong.designpattern.iterator;
public class Book {
private String bookName;
public Book(String bookName) {
this.bookName = bookName;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
}
Ø Main.java
package com.yilong.designpattern.iterator;
public class Main {
public static void main(String[] args) {
Collection objList = new ArrayList();
objList.add(new Book("《名侦探柯南》"));
objList.add(new Book("《游戏王》"));
objList.add(new Book("《三国演义》"));
Iterator iterator = objList.iterator();
while(iterator.hasNext()) {
Book book = (Book)iterator.next();
System.out.println(book.getBookName());
}
}
}
该设计模式的UML图如下:
说明:JDK的Iterator与上述的设计原理完全一样,因此测试的代码可以直接copy上述的代码,只需要引入具体的包即可。
Ø Main.java
package com.yilong.test.jdk.iterator;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class TestIterator {
public static void main(String[] args) {
Collection bookShelfs = new ArrayList();
bookShelfs.add(new Book("福尔摩斯"));
bookShelfs.add(new Book("名侦探柯南"));
bookShelfs.add(new Book("游戏王"));
System.out.println(bookShelfs.size());
Iterator bookShelfIterator = bookShelfs.iterator();
while(bookShelfIterator.hasNext()) {
Book book = (Book)bookShelfIterator.next();
System.out.println(book.getName());
}
ArrayList arrayList = new ArrayList();
System.out.println(arrayList.get(0));
}
}
设计一个容器的接口,用来定义这些”能装载任意对象的容器”的方法,从而在使用这些容器的时候可以更加灵活,更换起来只需要更改装载的容器的类型即可,其他方法都不用改变。
Ø 接口Collection.java
package com.yilong.designpattern.iterator;
public interface Collection {
public void add(Object obj);
public int size();
public Iterator iterator();
}
Ø 实现了Collection接口的ArrayList.java
package com.yilong.designpattern.iterator;
public class ArrayList implements Collection {
Object[] objs = new Object[10];
int index = 0;
public void add(Object obj) {
if(index == objs.length) {
Object[] newObjs = new Object[objs.length * 2];
System.arraycopy(objs, 0, newObjs, 0, objs.length);
objs = newObjs;
}
objs[index] = obj;
index ++;
}
public Iterator iterator() {
return new ArrayIterator(this);
}
public int size() {
return index;
}
public Object get(int i) {
return objs[i];
}
}
说明:System.arraycopy(objs, 0, newObjs, 0, objs.length);表示把objs数组中索引为0-objs.length的元素复制到数组newObjs中,第一个0表示从newObjs的0位置开始复制。
容器的iterator()方法会调用适合本身容器进行遍历的迭代器Iterator。
还需要注意的一点是get(int i)方法不要放在Collection接口的方法定义中,因为Collection接口已经有iterator()方法足以遍历容器中元素了, 可见get(int i)方法并不是每种容器都必须的,因此更加适合于只定义在具体的容器中。
Ø 迭代器接口Iterator.java
package com.yilong.designpattern.iterator;
public interface Iterator {
public boolean hasNext();
public Object next();
}
说明:该接口主要有两个方法,一个是判断容器中是否还有下一个元素的hasNext(),另一个是取出容器中下一个元素next()方法。
Ø 实现了Iterator接口的ArrayIterator.java
package com.yilong.designpattern.iterator;
public class ArrayIterator implements Iterator{
private ArrayList arrayList;
private int index = 0;
ArrayIterator(ArrayList arrayList) {
this.arrayList = arrayList;
}
public boolean hasNext() {
if(this.index < this.arrayList.size()) {
return true;
} else {
return false;
}
}
public Object next() {
Object obj = arrayList.get(this.index);
this.index ++;
return obj;
}
}
说明:主要用以对ArrayList容器进行遍历的iterator类。
Ø Book.java
package com.yilong.designpattern.iterator;
public class Book {
private String bookName;
public Book(String bookName) {
this.bookName = bookName;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
}
Ø Main.java
package com.yilong.designpattern.iterator;
public class Main {
public static void main(String[] args) {
Collection objList = new ArrayList();
objList.add(new Book("《名侦探柯南》"));
objList.add(new Book("《游戏王》"));
objList.add(new Book("《三国演义》"));
Iterator iterator = objList.iterator();
while(iterator.hasNext()) {
Book book = (Book)iterator.next();
System.out.println(book.getBookName());
}
}
}
该设计模式的UML图如下:
说明:JDK的Iterator与上述的设计原理完全一样,因此测试的代码可以直接copy上述的代码,只需要引入具体的包即可。
Ø Main.java
package com.yilong.test.jdk.iterator;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class TestIterator {
public static void main(String[] args) {
Collection bookShelfs = new ArrayList();
bookShelfs.add(new Book("福尔摩斯"));
bookShelfs.add(new Book("名侦探柯南"));
bookShelfs.add(new Book("游戏王"));
System.out.println(bookShelfs.size());
Iterator bookShelfIterator = bookShelfs.iterator();
while(bookShelfIterator.hasNext()) {
Book book = (Book)bookShelfIterator.next();
System.out.println(book.getName());
}
ArrayList arrayList = new ArrayList();
System.out.println(arrayList.get(0));
}
}
相关文章推荐
- 设计模式(8) - 迭代器模式(iterator)- 实现ArrayList和linkedList的迭代器
- 设计模式学习—Iterator(迭代器)
- 设计模式 - 迭代模式(iterator pattern) Java 迭代器(Iterator) 详细解释
- Design Pattern Iterator 迭代器设计模式
- 设计模式学习—Iterator(迭代器)
- Android设计模式源码解析之迭代器(Iterator)模式
- Java设计模式—迭代器(Iterator)
- 设计模式之二十二------ Iterator(迭代器)
- 设计模式C++描述----20.迭代器(Iterator)模式
- (Boolan)C++设计模式 <十一> ——组合模式(Composite)、迭代器(Iterator)和责任链(Chain of Resposibility)
- Java设计模式之从[魔兽争霸、星际争霸、DOTA编队]分析迭代器(Iterator)模式
- 设计模式的征途—21.迭代器(Iterator)模式
- Go语言设计模式实践:迭代器(Iterator)
- 设计模式之Iterator迭代器
- JS-Javascript 迭代器设计模式 Iterator pattern
- [设计模式笔记]三. 行为型模式--18. Iterator模式(迭代器)对象行为型模式(一)
- [断断续续,瞎掰胡扯]我的设计模式-Iterator(迭代器)
- 迭代器设计模式Iterator
- Iterator设计模式,探究STL中迭代器的实现原理
- 浅学设计模式之迭代器<Iterator>模式