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

迭代器模式【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已經實現的方法即可啦。

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