設計模式(十三)--------------迭代器模式

https://www.bilibili.com/video/av29579073/?p=20

這篇博客我想說一下迭代器模式,迭代器模式我覺得大家並不陌生,因爲在數據結構容器的遍歷中我們常常用到這個迭代器。實現原理非常簡單,其實就是一個指針從容器的頂端向下不斷遍歷,防止出現越界。

它提供一種方法順序訪問一個聚合對象中各個元素, 而又無須暴露該對象的內部表示。代碼不需要詳細說明,只對相應的類進行說明一下。

首先聲明一下自定義的迭代器接口

/**
 *  自定義的迭代器接口
 * @author Administrator
 *
 */
public interface MyIterator {
	void first();	//將遊標指向第一個元素
	void next();	//將遊標指向下一個元素
	boolean hasNext();//判斷是否存在下一個元素
	
	boolean isFirst();
	boolean isLast();
	
	Object getCurrentObj();  //獲取當前遊標指向的對象
}

至於對於方法的實現還是比較簡單的,如果有時間和興趣可以參考一個ArrayList中關於迭代器的實現。

/**
 * 自定義的聚合類
 * @author Administrator
 *
 */
public class ConcreteMyAggregate {
	private List<Object> list = new ArrayList<Object>();

	public void addObject(Object obj){
		this.list.add(obj);
	}
	public void removeObject(Object obj){
		this.list.remove(obj);
	}

	public List<Object> getList() {
		return list;
	}

	public void setList(List<Object> list) {
		this.list = list;
	}
	
	
	//獲得迭代器
	public MyIterator  createIterator(){
		return new ConcreteIterator();
	}
	
	
	
	//使用內部類定義迭代器,可以直接使用外部類的屬性
	private class ConcreteIterator implements MyIterator {

		private int cursor;  //定義遊標用於記錄遍歷時的位置
		
		@Override
		public void first() {
			cursor = 0;
		}

		@Override
		public Object getCurrentObj() {
			return list.get(cursor);
		}

		@Override
		public boolean hasNext() {
			if(cursor<list.size()){
				return true;
			}
			return false;
		}

		@Override
		public boolean isFirst() {
			return cursor==0?true:false;
		}

		@Override
		public boolean isLast() {
			return cursor==(list.size()-1)?true:false;
		}

		@Override
		public void next() {
			if(cursor<list.size()){
				cursor++;
			}
		}
		
	}
	
	
	
	
}

 測試如下

public class Client {
	
	public static void main(String[] args) {
		ConcreteMyAggregate cma = new ConcreteMyAggregate();
		cma.addObject("aa");
		cma.addObject("bb");
		cma.addObject("cc");
		
		MyIterator iter = cma.createIterator();
		while(iter.hasNext()){
			System.out.println(iter.getCurrentObj());
			iter.next();
		}
		
	}
}

 

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