您好,登錄后才能下訂單哦!
本文源碼:GitHub·點這里 || GitEE·點這里
迭代器模式又叫游標模式,是對象的行為模式。迭代器模式可以順序地訪問一個聚集中的元素而不必暴露聚集的內部表象。
此抽象角色定義出遍歷元素所需的接口。
此角色實現了Iterator接口,并保持迭代過程中的游標位置。
此抽象角色給出創建迭代器(Iterator)對象的接口。
聚合持有對象集合,提供返回迭代器的方法,可以正確遍歷該集合。
持有對聚集及其迭代器對象的引用,調用迭代器對象的迭代接口。
public class C02_Iterator {
public static void main(String[] args) {
Object[] objArray = {"one","two","three","four","five"};
Aggregate aggregate = new ConcreteAggregate(objArray);
Iterator iterator = aggregate.createIterator();
while (!iterator.isEnd()){
System.out.println(iterator.currentItem());
iterator.next();
}
}
}
interface Iterator {
void first();
void next();
boolean isEnd();
Object currentItem();
}
class ConcreteIterator implements Iterator{
//持有被迭代的聚合對象
private ConcreteAggregate agg;
//記錄當前迭代索引位置
private int index = 0;
//設置當前聚集對象的大小
private int size = 0;
public ConcreteIterator (ConcreteAggregate agg){
this.agg = agg;
this.size = agg.getSize();
index = 0;
}
@Override
public void first() {
index = 0;
}
@Override
public void next() {
if (index<size){
index++;
}
}
@Override
public boolean isEnd() {
return (index>=size);
}
@Override
public Object currentItem() {
return agg.getElement(index);
}
}
abstract class Aggregate {
// 創建相應迭代器對象的接口
public abstract Iterator createIterator();
}
class ConcreteAggregate extends Aggregate{
private Object[] objArray = null;
public ConcreteAggregate (Object[] objArray){
this.objArray = objArray;
}
@Override
public Iterator createIterator() {
return new ConcreteIterator(this);
}
public Object getElement (int index){
if (index<objArray.length){
return objArray[index];
} else {
return null;
}
}
public int getSize (){
return objArray.length;
}
}
public class C02_ArrayList {
public static void main(String[] args) {
List<String> stringList = new ArrayList<>() ;
stringList.add("One") ;
stringList.add("Two") ;
stringList.add("Three") ;
java.util.Iterator<String> itr = stringList.iterator() ;
while (itr.hasNext()){
System.out.println(itr.next());
}
}
}
規定了集合迭代的一些方法。
public interface Iterator<E> {
boolean hasNext();
E next();
default void remove() {
throw new UnsupportedOperationException("remove");
}
default void forEachRemaining(Consumer<? super E> action) {
Objects.requireNonNull(action);
while (hasNext())
action.accept(next());
}
}
實現聚合接口List
ArrayList<E> extends AbstractList<E> implements List<E>
內部迭代器接口實現
private class Itr implements Iterator<E> {
int cursor;
int lastRet = -1;
int expectedModCount = modCount;
Itr() {}
public boolean hasNext() {}
public E next() {}
public void remove() {}
public void forEachRemaining(Consumer<? super E> consumer) {}
final void checkForComodification() {}
}
public Iterator<E> iterator() {
return new Itr();
}
1、適用場景
迭代器模式是與集合綁定,只要使用集合,就需要同時這個集合的迭代器,以此遍歷集合中的數據,java中的容器對象Collection,List、Set、Map都有自己的迭代器。容器對象在編程語言中十分核心,所以在實現容器的時候基本都有匹配的迭代器,可以滿足開發的需要,所以迭代器的自定義實踐場景比較少。
2、優點總結
簡化集合遍歷方式,每一個聚集對象都可以有一個或多個迭代器對象,每一個迭代器的迭代狀態可以是彼此獨立的。遍歷算法被封裝在迭代器角色里面,因此迭代的算法可以獨立于聚集角色變化。
GitHub·地址
https://github.com/cicadasmile/model-arithmetic-parent
GitEE·地址
https://gitee.com/cicadasmile/model-arithmetic-parent
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。