GoF設計模式-迭代器模式模式

    迭代器模式(重要):
        對象結構型模式,提供一種方法來訪問來聚合對象,而不暴露這個聚合對象的內部數據。通過引入迭代器將數據的遍歷功能從聚合對象中分離出來,聚合對象只負責存儲數據,而遍歷數據由迭代器來完成,簡化了聚合對象的設計,符合單一職責原則
        迭代器模式的結構:抽象迭代器(定義訪問和遍歷元素的接口),迭代器(實現對聚合對象的遍歷,並跟蹤遍歷的位置),抽象聚合類(存儲數據,並定義創建迭代器對象的接口),聚合類(實現創建相應迭代器的接口),爲了方便,一般將迭代器類作爲聚合類的內部類,這樣迭代器類可以就直接訪問聚合類中的數據
        聚合對象主要有兩個職責:(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
    
    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章