類圖
迭代器模式.png
實(shí)現(xiàn)
調(diào)用
package com.company;
public class Main {
public static void main(String[] args) {
// write your code here
Container targetContainer = new SomeContainer();
Iterator targetIterator0 = targetContainer.createIterator();
while (targetIterator0.hasNext())
System.out.println(targetIterator0.next());
System.out.println("+++++++++++++");
Iterator targetIterator1 = targetContainer.createIterator();
targetIterator1.remove();
while (targetIterator1.hasNext())
System.out.println(targetIterator1.next());
}
}
輸出
one
two
three
four
five
+++++++++++++
one
two
three
four
Process finished with exit code 0
抽象容器類型Container
package com.company;
/**
* 這是聚合容器的抽象類型梳猪。
*/
public interface Container {
/**
* 創(chuàng)建迭代器的接口
* @return
*/
Iterator createIterator();
}
抽象迭代器類型Iterator
package com.company;
/**
* 迭代器的抽象類型
*/
public interface Iterator {
/**
* 判斷是否還有下一個(gè)元素的接口
* @return
*/
boolean hasNext();
/**
* 獲取下一個(gè)元素的接口
* @return
*/
Object next();
/**
* 移除最后一個(gè)元素
*/
void remove();
}
具體的容器和迭代器SomeContainer
package com.company;
/**
* 這個(gè)是具體的聚合容器類
*/
public class SomeContainer implements Container {
//這是對(duì)象內(nèi)部實(shí)際存儲(chǔ)數(shù)據(jù)的地方艳馒。
private String words[] = {"one","two","three","four","five"};
@Override
public Iterator createIterator() {
return new SomeIterator();
}
/**
* 之所以采用內(nèi)部類的方式是因?yàn)楹渤牛@樣可以直接訪問(wèn)內(nèi)部實(shí)際的數(shù)據(jù)序厉。
*/
private class SomeIterator implements Iterator {
//這個(gè)地方值得注意饼灿,它一開(kāi)始的值是-1彪标,
// 不然的話在遍歷的時(shí)候你會(huì)錯(cuò)過(guò)第一個(gè)元素值仿便。
private int index = -1;
private int elementCount = words != null?words.length:0;
@Override
public boolean hasNext() {
return (index < elementCount - 1);
}
@Override
public Object next() {
index++;
if (index < elementCount)return words[index];
return null;
}
@Override
public void remove() {
if (elementCount > 0)elementCount--;
}
}
}
Chapter 9 the Iterator and Composite Patterns——Well-Managed Collections