迭代器模式(重要):
對象結構型模式,提供一種方法來訪問來聚合對象,而不暴露這個聚合對象的內部數據。通過引入迭代器將數據的遍歷功能從聚合對象中分離出來,聚合對象只負責存儲數據,而遍歷數據由迭代器來完成,簡化了聚合對象的設計,符合單一職責原則
迭代器模式的結構:抽象迭代器(定義訪問和遍歷元素的接口),迭代器(實現對聚合對象的遍歷,並跟蹤遍歷的位置),抽象聚合類(存儲數據,並定義創建迭代器對象的接口),聚合類(實現創建相應迭代器的接口),爲了方便,一般將迭代器類作爲聚合類的內部類,這樣迭代器類可以就直接訪問聚合類中的數據
聚合對象主要有兩個職責:(1)存儲內部數據 (2)遍歷內部數據 使用迭代器將遍歷功能從聚合對象中分離出來
迭代器模式的適用場景:
1.遍歷一個聚合對象而無須暴露它的內部數據
2.需要爲聚合對象提供多種遍歷方式
3.爲遍歷不同的聚合結構提供一個統一的接口(抽象接口一樣,增加以不同方式遍歷的新的迭代器類即可)
迭代器模式的優點:
1.支持以不同的方式遍歷一個聚合對象
2.將遍歷功能分離出來,簡化了聚合類
3.一個聚合對象可以有多個遍歷操作
4.增加新的聚合類和迭代器類不需修改原有代碼,符合開閉原則
迭代器模式的缺點:
1.增加新的聚合類,需要對應增加新的迭代器類,類的個數成對增加,在一定程度上增加了系統的複雜度
迭代器模式的例子
抽象聚合接口
public interface Television {
TVIterator createIterator();
}
抽象迭代器接口
public interface TVIterator {
void setChannel(int i);
void next();
void previous();
boolean hasNext();
Object currentChannel();
boolean isFirst();
}
聚合類和迭代器類
public class SkyworthTelevision implements Television{
private Object[] obj = {"CCTV-1","CCTV-2","CCTV-3","CCTV-4","CCTV-5","CCTV-6","CCTV-7","CCTV-8"};
/**
* @Description: TODO
* @author doudou
* @date 2019年10月14日
* @return
* @throws
* @return
* @see behavioral.IteratorPattern.Television#createIterator()
*/
@Override
public TVIterator createIterator() {
return new SkyworthIterator();
}
private class SkyworthIterator implements TVIterator{
private int currentIndex = 0;
/**
* @Description: TODO
* @author doudou
* @date 2019年10月14日
* @param i
* @throws
* @return
* @see behavioral.IteratorPattern.TVIterator#setChannel(int)
*/
@Override
public void setChannel(int i) {
this.currentIndex = i;
}
/**
* @Description: TODO
* @author doudou
* @date 2019年10月14日
* @throws
* @return
* @see behavioral.IteratorPattern.TVIterator#next()
*/
@Override
public void next() {
if (this.currentIndex < obj.length) {
++currentIndex;
}else {
System.out.println("沒有下一個元素了。。。");
}
}
/**
* @Description: TODO
* @author doudou
* @date 2019年10月14日
* @throws
* @return
* @see behavioral.IteratorPattern.TVIterator#previous()
*/
@Override
public void previous() {
if (currentIndex > 0) {
--currentIndex;
}
}
/**
* @Description: TODO
* @author doudou
* @date 2019年10月14日
* @return
* @throws
* @return
* @see behavioral.IteratorPattern.TVIterator#hasNext()
*/
@Override
public boolean hasNext() {
return currentIndex < obj.length;
}
/**
* @Description: TODO
* @author doudou
* @date 2019年10月14日
* @return
* @throws
* @return
* @see behavioral.IteratorPattern.TVIterator#currentChannel()
*/
@Override
public Object currentChannel() {
return obj[currentIndex];
}
/**
* @Description: TODO
* @author doudou
* @date 2019年10月14日
* @return
* @throws
* @return
* @see behavioral.IteratorPattern.TVIterator#isFirst()
*/
@Override
public boolean isFirst() {
return currentIndex == 0;
}
}
}
public class TCLTelevision implements Television{
private Object[] obj = {"河南衛視","湖南衛視","北京衛視","上海衛視","湖北衛視","黑龍江衛視"};
/**
* @Description: TODO
* @author doudou
* @date 2019年10月14日
* @return
* @throws
* @return
* @see behavioral.IteratorPattern.Television#createIterator()
*/
@Override
public TVIterator createIterator() {
// TODO Auto-generated method stub
return new TCLIterator();
}
private class TCLIterator implements TVIterator{
private int currentIndex = 0;
/**
* @Description: TODO
* @author doudou
* @date 2019年10月14日
* @param i
* @throws
* @return
* @see behavioral.IteratorPattern.TVIterator#setChannel(int)
*/
@Override
public void setChannel(int i) {
this.currentIndex = i;
}
/**
* @Description: TODO
* @author doudou
* @date 2019年10月14日
* @throws
* @return
* @see behavioral.IteratorPattern.TVIterator#next()
*/
@Override
public void next() {
if (this.currentIndex < obj.length) {
++currentIndex;
}else {
System.out.println("沒有下一個元素了。。。");
}
}
/**
* @Description: TODO
* @author doudou
* @date 2019年10月14日
* @throws
* @return
* @see behavioral.IteratorPattern.TVIterator#previous()
*/
@Override
public void previous() {
if (currentIndex > 0) {
--currentIndex;
}
}
/**
* @Description: TODO
* @author doudou
* @date 2019年10月14日
* @return
* @throws
* @return
* @see behavioral.IteratorPattern.TVIterator#hasNext()
*/
@Override
public boolean hasNext() {
return currentIndex < obj.length;
}
/**
* @Description: TODO
* @author doudou
* @date 2019年10月14日
* @return
* @throws
* @return
* @see behavioral.IteratorPattern.TVIterator#currentChannel()
*/
@Override
public Object currentChannel() {
return obj[currentIndex];
}
/**
* @Description: TODO
* @author doudou
* @date 2019年10月14日
* @return
* @throws
* @return
* @see behavioral.IteratorPattern.TVIterator#isFirst()
*/
@Override
public boolean isFirst() {
return currentIndex == 0;
}
}
}
測試類
public class Main {
public static void main(String[] args) {
Television tvTelevision = new TCLTelevision();
TVIterator tvIterator = tvTelevision.createIterator();
while(tvIterator.hasNext()) {
System.out.println(tvIterator.currentChannel().toString());
tvIterator.next();
}
}
}
迭代器模式的應用:
1.java集合的Iterator