一、概述
一看到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的底層實現也是迭代,就相當於在使用迭代器模式了,這裏只是簡單舉個例子進行說明該模式,在實際應用中,還是要從需求出發,採用更便捷的方式纔好。
寫在最後,
本文主要是小貓看了《大話設計模式》的一些記錄筆記,再加之自己的一些理解整理出此文,方便以後查閱,僅供參考。