行為型設計模式-迭代器模式
阿新 • • 發佈:2019-02-01
迭代器模式:
提供一種方法順序訪問一個聚合物件中的各個元素,而不需要暴露該物件的內部實現,可以實現保護目標物件的目的。
應用:JDK自帶的集合框架
迭代器模式參與角色:
迭代器角色(Iterator):迭代器角色負責定義訪問和遍歷元素的介面。
具體迭代器角色(Concrete Iterator):具體迭代器角色要實現迭代器介面,並要記錄遍歷中的當前位置。
容器角色(Container):容器角色負責提供建立具體迭代器角色的介面。
具體容器角色(Concrete Container):具體容器角色實現建立具體迭代器角色的介面——這個具體迭代器角色於該容器的結構相關。
容器角色:Container
package com.zhiwei.iterator;
public interface Container {
public void add(Object obj);
public void remove(Object obj);
public Iterator iterator();
}
具體容器角色:ConcreteContainer
package com.zhiwei.iterator;
import java.util.ArrayList;
import java.util.List;
public class ConcreteContainer implements Container {
private List<Object> list = new ArrayList<Object>();
/**
* 提供容器的迭代器訪問介面
*/
public Iterator iterator() {
return new ConcreteIterator(list);
}
/**
* 容器自身的新增元素操作
*/
public void add(Object obj) {
list.add(obj);
}
/**
* 容器自身的減少元素操作
*/
public void remove(Object obj) {
list.remove(obj);
}
}
迭代器角色:Iterator
package com.zhiwei.iterator;
public interface Iterator {
public Object next();
public boolean hasNext();
}
具體迭代器角色:ConcreteIterator
package com.zhiwei.iterator;
import java.util.ArrayList;
import java.util.List;
public class ConcreteIterator implements Iterator {
private List<Object> list = new ArrayList<Object>();
private int cursor = 0;
/**
* 迭代器關聯具體的容器類
* @param list
*/
public ConcreteIterator(List<Object> list) {
this.list = list;
}
/**
* 判斷容器是否還有下一個元素
*/
public boolean hasNext() {
if (cursor == list.size()) {
return false;
}
return true;
}
/**
* 獲取容器的下一個元素
*/
public Object next() {
Object obj = null;
if (this.hasNext()) {
obj = this.list.get(cursor++); //儲存遊標位置
}
return obj;
}
}
測試程式碼:
Container container = new ConcreteContainer();
container.add("小明");
container.add("小紅");
container.add("小剛");
Iterator it = container.iterator(); //獲取迭代器:容器物件和迭代器物件已經關聯
while (it.hasNext()) {
String str = (String) it.next();
System.out.println(str);
}
效果:
通俗解釋:
我們通過投硬幣去買地鐵票,可以確定買地鐵票的機器肯定有一個儲存地鐵幣的盒子,當我們投入硬幣買票時候,買票機器能偶檢測到剩餘的地鐵幣的數量,然後返回給客戶自身。這裡可以將存放地鐵幣的盒子扮演具體容器角色,而買票機器可以看作是一個迭代器,他知道容器裡面的所有資訊,併為外界提供一個訪問的介面,實現對具體容器物件(地鐵幣盒子)的資訊隱蔽。