迭代器模式【Iterator Pattern 】
迭代器可以解決一些遍歷的問題。那我們以老總查看公司項目信息爲例。先看下最初的類圖。
上面的類圖可以完成老總的需要,下面使用迭代器的方式來進行。看下類圖:
IProject 可以定義如下:
public interface IProject {
//增加項目
public void add(String name,int num,int cost);
//從老闆這裏看到的就是項目信息
public String getProjectInfo();
//獲得一個可以被遍歷的對象
public IProjectIterator iterator();
}
定義一個實現類:
public class Project implements IProject {
//定義一個項目列表,說有的項目都放在這裏
private ArrayList<IProject> projectList = new ArrayList<IProject>();
//項目名稱
private String name = "";
//項目成員數量
private int num = 0;
//項目費用
private int cost = 0;
public Project(){
}
//定義一個構造函數,把所有老闆需要看到的信息存儲起來
private Project(String name,int num,int cost){
//賦值到類的成員變量中
this.name = name;
this.num = num;
this.cost=cost;
}
//增加項目
public void add(String name,int num,int cost){
this.projectList.add(new Project(name,num,cost));
}
//得到項目的信息
public String getProjectInfo() {
String info = "";
//獲得項目的名稱
info = info+ "項目名稱是:" + this.name;
//獲得項目人數
info = info + "\t項目人數: "+ this.num;
//項目費用
info = info+ "\t 項目費用:"+ this.cost;
return info;
}
//產生一個遍歷對象
public IProjectIterator iterator(){
return new ProjectIterator(this.projectList);
}
}
看迭代器接口:
public interface IProjectIterator extends Iterator {
}
什麼方法都木有,要實現一個容器或者其他 API 提供接口時,一般先寫一個接口繼承, 然後再繼承自己寫的接口, 保證自己的實現類只用實現自己寫的接口 。
該接口的實現:
public class ProjectIterator implements IProjectIterator {
//所有的項目都放在這裏ArrayList中
private ArrayList<IProject> projectList = new ArrayList<IProject>();
private int currentItem = 0;
//構造函數傳入projectList
public ProjectIterator(ArrayList<IProject> projectList){
this.projectList = projectList;
}
//判斷是否還有元素,必須實現
public boolean hasNext() {
//定義一個返回值
boolean b = true;
if(this.currentItem>=projectList.size() ||
this.projectList.get(this.currentItem) == null){
b =false;
}
return b;
}
//取得下一個值
public IProject next() {
return (IProject)this.projectList.get(this.currentItem++);
}
//刪除一個對象
public void remove() {
//暫時沒有使用到
}
}
在主類進行調用時
//定義一個List,存放所有的項目對象
IProject project = new Project();
project.add(,,,);
//遍歷一下ArrayList,把所有的數據都取出
IProjectIterator projectIterator = project.iterator();
while(projectIterator.hasNext()){
IProject p = (IProject)projectIterator.next();
System.out.println(p.getProjectInfo());
}
從面向對象的開發上來看,project.add()增加一個項目顯得更加的友好。
最後看下,通用類圖:
其實這樣看起來迭代器顯得有些複雜了,但是在項目中基本無需我們自己去定義迭代器了,看下面就知道了。
從上圖可以看出很多的子類繼承了Iterable這個接口,我們直接使用 List 或者 Map 就已經可以完整的解決問題了。
總結:
迭代器模式主要是解決一下遍歷的問題,但是由於隨着JDK版本的升級,Iterator已經應用到各個聚集類(Collection)中了,所以一般使用迭代器模式只需使用JDK已經實現的方法即可啦。