一天一個設計模式——迭代器模式

1、模式說明設計模式

迭代操做在程序開發中很常見:在數據集合中按順序便利全部元素(例如:遍歷一個數組中的全部元素),將遍歷時使用的索引(如訪問數組循環變量i)抽象化、通用化後造成的模式就是迭代器模式。數組

核心的迭代器通常包含兩個方法:hasNext()和next()方法,前一個方法用於判斷集合中是否還存在下一個須要迭代的元素,返回值類型是Bool類型;next()方法用於返回集合中一個元素,而且將迭代器移動到下一個元素。app

該模式的UML圖和示例代碼UML圖以下:ide

 

 

迭代模式的UML很簡單,包含兩個接口:Aggregate接口和Iterator接口,對應ConcreteAggregate角色和ConcreteIterator角色。this

  • Aggregate接口包含一個iterator方法,該方法返回一個iterator迭代器。
  • Iterator接口包含hasNext()和next()兩個方法。

上圖中,設計兩個接口,而沒有隻使用一個Iterator接口,緣由在於咱們須要將「遍歷功能」獨立於ConcreteAggregate角色以外,這樣就能夠針對一個ConcreteAggregate角色編寫多種不一樣的ConcreteIterator角色(從前向後遍歷、從後向前遍歷previous、跳躍遍歷)。spa

2、模式中的角色:設計

  • Iterator:迭代器角色:定義訪問和遍歷元素的接口;
  • Aggregate:集合角色:定義建立Iterator迭代器的接口;
  • ConcreteIterator:迭代器實現類;
  • ConcreteAggretator:具體聚合實現累;

3、模式代碼示例:code

(代碼分爲兩個包,patterndesign包用於設計模式的代碼實現,patterndemostrate用於模式代碼的使用實例說明)blog

代碼結構:索引

模式相關代碼:

Aggregrate接口:

package com.designpattern.cn.iteratorpattern.patterndesign;

public interface Aggregate {
    public abstract Iterator iterator();
}
View Code

Iterator接口:

package com.designpattern.cn.iteratorpattern.patterndesign;

public interface Iterator {
    public abstract boolean hasNext();
    public abstract Object next();
}
View Code

 

模式實現演示:

Book書籍類:

package com.designpattern.cn.iteratorpattern.patterndemostrate;

public class Book {
    private String name;

    public Book(String name){
        this.name = name;
    }

    public String getName() {
        return name;
    }
}
View Code

BookShelf書架類(相似模擬一個集合類):

package com.designpattern.cn.iteratorpattern.patterndemostrate;

import com.designpattern.cn.iteratorpattern.patterndesign.Aggregate;
import com.designpattern.cn.iteratorpattern.patterndesign.Iterator;

public class BookShelf implements Aggregate {

    private Book books[];
    private int last = 0;

    public BookShelf(int size){
        this.books = new Book[size];
    }

    public Book getBookAt(int index){
        return books[index];
    }

    public void appendBook(Book book){
        this.books[last] = book;
        last++;
    }

    public int getLength(){
        return last;
    }

    @Override
    public Iterator iterator() {
        return new BookShelfIterator(this);
    }
}
View Code

迭代器類(實現了書架類(模擬集合)中元素的迭代):

package com.designpattern.cn.iteratorpattern.patterndemostrate;

import com.designpattern.cn.iteratorpattern.patterndesign.Iterator;

public class BookShelfIterator implements Iterator {
    private BookShelf bookShelf;
    private int index;

    public BookShelfIterator(BookShelf bookShelf){
        this.bookShelf = bookShelf;
        this.index = 0;
    }

    public boolean hasNext(){
        return index < bookShelf.getLength();
    }

    public Object next(){
        Book book = bookShelf.getBookAt(index);
        index++;
        return book;
    }
}
View Code

運行結果:

 

4、相關的模式

  • Visitor模式(訪問者模式):迭代模式僅僅遍歷取出元素,並無作任何處理,若是遍歷元素的同時對每一個元素作相同的處理,則這種模式是visitor模式(訪問者模式);
  • Factory Method模式(工廠方法模式):在iterator方法中生成Iterator實例時可能採用到工廠方法模式;

 

 

此隨筆參照中國工信出版集團,人民郵電出版社的《圖解設計模式》梳理。

相關文章
相關標籤/搜索