迭代器模式
迭代器模式屬於行爲型模式,描述的是類之間的關係
定義: 它提供一種方法訪問一個容器對象中各個元素,而又不需暴露該對象的內部細節
迭代器模式就是爲解決遍歷元素而誕生的,java而言,使用java提供的iterator就可以了,不用需要手動去寫迭代器
模式類圖
角色:
- 抽象迭代器:Iterator,負責定義訪問和遍歷元素的接口
- 具體迭代器:ConcreteIterator,實現Iterator接口
- 抽象容器:Aggregate,負責提供創建具體迭代器角色的接口
- 具體容器: ConcreteAggregate,實現Aggregate接口
抽象迭代器
Iterator提供兩個方法,返回下一個元素,是否還有下一個元素
public interface Iterator {
/**
* 返回下一個元素
* @return
*/
public Object next();
/**
* 是否還有下一個元素
* @return
*/
public boolean hasNext();
}
具體迭代器實現
cursor爲容器遍歷元素時當前元素的容器下標
public class ConcreteIterator implements Iterator {
/**
* 當前位置
*/
public int cursor = 0;
/**
* 容器
*/
private List<String> list;
public ConcreteIterator(List<String> list) {
this.list = list;
}
@Override
public Object next() {
if(this.hasNext()){
return this.list.get(this.cursor++);
}
return null;
}
@Override
public boolean hasNext() {
if(this.cursor == this.list.size()){
return false;
}else{
return true;
}
}
}
抽象容器
提供三個方法,增加容器元素,刪除容器元素,獲取當前容器的迭代器
public interface Aggregate {
/**
* 增加元素
* @param s
*/
public void add(String s);
/**
* 刪除元素
* @param s
*/
public void remove(String s);
/**
* 獲取當前容器的迭代器
* @return
*/
public Iterator createIterator();
}
具體容器實現
public class ConcreteAggregate implements Aggregate {
private List<String> list = new ArrayList<>();
@Override
public void add(String s) {
list.add(s);
}
@Override
public void remove(String s) {
list.remove(s);
}
@Override
public Iterator createIterator() {
return new ConcreteIterator(list);
}
}
驗證
public static void main(String[] args) {
Aggregate aggregate = new ConcreteAggregate();
aggregate.add("first title");
aggregate.add("second title");
aggregate.add("third title");
Iterator iterator = aggregate.createIterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
輸出
first title
second title
third title
參考:設計模式之禪:https://www.kancloud.cn/sstd521/design/193578