Java設計模式之迭代器模式(Iterator)

一、概述

一看到Iterator,相信大家都很熟悉,沒錯,Iterator就是你們熟悉的它,主要功能就是迭代對象進行遍歷,由於它太太太普遍了,所以Java已經將它融爲到語言中了。在jdk中也提供了java.util.Iterator接口,並應用於各個集合當中,我們可以用集合中的iterator()方法進行遍歷,不需要我們再額外自己去寫迭代器的方法了,所以迭代器模式也顯得不那麼重要了。但其實它算是使用頻率最高的模式之一了,只是不需要我們自己去設計了,而是已經被設計在我們常常使用的集合之中了。

但作爲23種常用的設計模式之一,這裏我還是對迭代器模式做一個簡單的學習和總結。

二、迭代器模式

1. 定義

迭代器模式,提供一種方法順序訪問一個聚合對象中的各個元素,而又不暴露該對象的內部表示。(引自《大話設計模式》)

2. 基本結構

 Aggregate:聚集抽象類。

ConcreteAggregate:具體聚集類,實現了創建迭代器對象的方法。

MyIterator:迭代器抽象類,主要提供了4個統一接口——得到開始對象、得到下一對象、是否是最後一個、得到當前對象,這裏的方法根據需求可以隨意增減。

ConcreteIterator:具體迭代器類。

3. 一些說明

jdk中已經提供了Iterator接口,包含了如下方法:

所以,如果這些方法已經可以滿足當前需求時,可直接讓ConcreteIterator繼承Iterator即可,或者讓MyIterator繼承Iterator,然後在MyIterator中進行一些新方法的補充。

類圖已經很清晰了,下面我從一個實際例子出發進一步說明此模式。

三、實戰應用

舉個例子說明,很簡單的例子,現在要遍歷某部門的員工信息。

用類圖分析一下吧

我這裏面的IMyIterator就繼承了Iterator,而且我沒有寫新的方法,因爲Iterator中的hasNext()和next()方法已經可以滿足我目前的需求,從現在這個需求來說,可以省略IMyIterator,讓ConcreteIterator直接繼承Iterator也可以。

看一下代碼實現~

IPerson

/**
 * 聚集抽象類
 */
public interface IPerson {
	public void add(String name,int age,String sex);//新增員工:姓名,年齡,性別
	public String gerInfo();//獲取員工信息
	public IMyIterator iterator();//遍歷員工
}

 IMyIterator

/**
 * 迭代抽象類
 */
public interface IMyIterator extends Iterator<IPerson>{
	
}

ConcretePerson,這裏包含了name,age,sex三個員工屬性,也可以用實體類來表示,這裏爲了簡便只是羅列了出來。

public class ConcretePerson implements IPerson {
	private List<IPerson> personList = new ArrayList<IPerson>();//聲明員工集合
	private String name;
	private int age;
	private String sex;
	
	public ConcretePerson() {
		super();
	}
	
	public ConcretePerson(String name,int age,String sex) {
		this.name = name;
		this.age = age;
		this.sex = sex;
	}
	@Override
	public void add(String name,int age,String sex) {
		this.personList.add(new ConcretePerson(name,age,sex));
	}

	@Override
	public String gerInfo() {
		return "員工姓名:"+this.name+",員工年齡:"+String.valueOf(this.age)+",員工性別:"+this.sex;
	}

	@Override
	public IMyIterator iterator() {
		return new ConcreteMyIterator(this.personList);
	}

}

ConcreteMyIterator

public class ConcreteMyIterator implements IMyIterator {
	private List<IPerson> personList = new ArrayList<IPerson>();//聲明員工集合
	private int current = 0;
	
	public ConcreteMyIterator(List<IPerson> personList) {
		this.personList = personList;
	}
	
	@Override
	public boolean hasNext() {
		return current >= personList.size() ? false : true;
	}

	@Override
	public IPerson next() {
		IPerson p = personList.get(current);
		current++;
		return p;
	}

}

測試類

public class IteratorTest {

	public static void main(String[] args) {
		//聲明聚集對象
		IPerson person = new ConcretePerson();
		
		//來新員工了~~~
		person.add("張三", 20, "男");
		person.add("李四", 19, "男");
		person.add("韓梅梅", 18, "女");
		
		//遍歷
		IMyIterator i = person.iterator();
		while(i.hasNext()) {
			IPerson p = i.next();
			System.out.println(p.gerInfo());
		}
	}

}

結果

從類圖和具體代碼實現來看,整個結構還是比較清晰的,但其實從實際來說,如果只是簡單的遍歷,我們無需如此周張的用幾個類來實現遍歷,只要簡單的遍歷list即可。其實list的底層實現也是迭代,就相當於在使用迭代器模式了,這裏只是簡單舉個例子進行說明該模式,在實際應用中,還是要從需求出發,採用更便捷的方式纔好。

 

寫在最後,

本文主要是小貓看了《大話設計模式》的一些記錄筆記,再加之自己的一些理解整理出此文,方便以後查閱,僅供參考。

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