一、模式簡(jiǎn)介
定義:提供一個(gè)對(duì)象來(lái)順序訪問(wèn)聚合對(duì)象中的一系列數(shù)據(jù),而不暴露聚合對(duì)象的內(nèi)部表示。
場(chǎng)景:遍歷不同的聚合結(jié)構(gòu)提供統(tǒng)一的接口。訪問(wèn)聚合對(duì)象的內(nèi)容而無(wú)須暴露其內(nèi)部細(xì)節(jié)的表示。
- 角色結(jié)構(gòu):
- 抽象聚合(Aggregate)角色:定義存儲(chǔ)、添加、刪除聚合對(duì)象以及創(chuàng)建迭代器對(duì)象的接口。
- 具體聚合(Concrete Aggregate)角色:實(shí)現(xiàn)抽象聚合類,返回一個(gè)具體迭代器的實(shí)例。
- 抽象迭代器(Iterator)角色:定義訪問(wèn)和遍歷聚合元素的接口。
- 具體迭代器(Concrete lterator)角色:實(shí)現(xiàn)抽象迭代器接口中所定義的方法,完成對(duì)聚合對(duì)象的遍歷,記錄遍歷的當(dāng)前位置。
二、模式實(shí)現(xiàn)
public interface AbstractAggregate { -> 抽象聚合
void add(Object o);
void remove(Object o);
AbstractIterator iterator();
}
public class ConcreteAggregate implements AbstractAggregate { -> 具體聚合
private List<Object> list = new ArrayList<>();
@Override
public void add(Object o) {
list.add(o);
}
@Override
public void remove(Object o) {
list.remove(o);
}
@Override
public AbstractIterator iterator() {
return new ConcreteIterator(list);
}
}
public interface AbstractIterator { -> 抽象迭代
Object first();
Object next();
boolean hasNext();
void remove();
}
public class ConcreteIterator implements AbstractIterator { -> 具體迭代
private List<Object> list;
private int index = -1;
public ConcreteIterator(List<Object> list) {
if (list != null) {
this.list = list;
} else {
this.list = new ArrayList<>();
}
}
@Override
public Object first() {
return list.size() > 0 ? list.get(0) : null;
}
@Override
public Object next() {
return hasNext() ? list.get(++index) : null;
}
@Override
public boolean hasNext() {
return index < list.size() - 1;
}
@Override
public void remove() {
if (index >= 0 && list.size() > index) {
list.remove(index);
index--;
}
}
}
以遍歷集合輸出每個(gè)元素的信息為例子
AbstractAggregate aggregate = new ConcreteAggregate();
aggregate.add("w");
aggregate.add("j");
aggregate.add("x");
AbstractIterator iterator = aggregate.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next().toString());
iterator.remove();
}