Android App 開發 設計模式第一篇:迭代器模式

來源:互聯網
上載者:User

Iterator Pattern迭代器模式迭代器模式:提供一種方法順序訪問一個彙總對象中各個元素,而又不暴露該對象的內部表示.

迭代器模式可以用來作為遍曆一個集合體。java 亦提供了一個工具類: java.util.Iterator<E> ,與其類似。

 1.當你需要訪問一個聚集對象,而且不管這些對象是什麼都需要遍曆時,就應該考慮用迭代器模式。

 2.當需要對聚集對象有多種遍曆方式時,可以考慮用迭代器模式。

 3.迭代器模式在訪問數組,集合,列表等資料時,尤其是資料庫資料操作時,是非常普遍的應用,

    所以各種進階語言 都對它進行了封裝,反而給人感覺此模式本身不太常用。

4.便於儲存遍曆狀態,對資料進行多個遍曆

 

情境需求

  書架上有5本技術書籍,要求將書籍名稱一性遍曆出來,將顯示在Andriod 的 EditText 上面。以上面的需求為例,可以將具體需求具體到下面的:

 

Aggregate介面

  Aggregate 介面是一個執行遞增的“彙總”。實現此介面的類就變成類似數組、集合的“彙總”。表示己彙總的介面。

Iterator介面

  Iterator 介面執行元素遞增,具有類似迴圈變數的功能。表示執行遞增、遞減、遍曆的介面。

Book 類

  Book 表示書籍,主要是為了擷取書的詳細。

BookShelf類

  BookShelf 表示書架,此類實現Aggregate介面從而將其作為彙總處理。

BookShelfIterator類

  BookShelfIterator表示掃描書架的類,實現了Iterator 的介面功能。

Main 類

  用來顯示和測試上面編寫的代碼

-----------------------------------------

代碼實現:  Aggregate介面(聚集抽象類別)

  

/**
 * 抽象出要建立遍曆的介面方法
 */
public abstract interface Aggregate {
public abstract Iterator createDecIterator(); 
public abstract Iterator createIncIterator(); 
}

 

  Iterator 介面(迭代器抽象類別)

 


public abstract class Iterator {
public abstract Object first(); 
public abstract boolean hasNext(); 
public abstract Object next();
public abstract Object currentItem();
}

  Book 類 

/**
 * 表示 書籍的類
 *
 */
public class Book {

    private String name="";
    public Book(String name){
        this.name=name;
    }
    
    public String getName(){
        return this.name;
    }
}

 

  BookShelf 類(聚集實作類別) import java.util.ArrayList;
import java.util.List;

public class BookShelf implements Aggregate {

private List<Object> mBookList;

public BookShelf() {
mBookList = new ArrayList<Object>();
}

@Override
public Iterator createDecIterator() {
return new BookShelfIteratorDec(this);
}

@Override
public Iterator createIncIterator() {
return new BookShelfIteratorInc(this);
}

public BookShelf addBook(Book book) {
mBookList.add(book);
return this;
}

public List<Object> getItems() {
return mBookList;
}

}

  BookShelf實現了Aggregate 介面 ,該方法產生並返回createDecIterator,createIncIterator類的對象執行個體,即我們發一個命令說要對書架進行掃描時,就將得到的“彙總”返回出去。

 

  BookShelfIteratorDec 類(實現迭代器類) public class BookShelfIteratorDec extends Iterator {

private BookShelf mBookShelf;
private int mCurrent;

public BookShelfIteratorDec(BookShelf bookShelf) {
this.mBookShelf = bookShelf;
this.mCurrent = bookShelf.getItems().size(); 
}

@Override
public Object first() {
return mBookShelf.getItems().get(mBookShelf.getItems().size() - 1);
}

@Override
public Object next() {// 得到聚集的下一個對象  
        Object ref = null;  
        mCurrent--;  
        if(mCurrent>=0){  
            ref = mBookShelf.getItems().get(mCurrent);  
        }  
        return ref;  
}

@Override
public Object currentItem() {
        return mBookShelf.getItems().get(mCurrent);  
}

@Override
public boolean hasNext() {
        return mCurrent < 1 ? false : true;  
}

}

   

BookShelfIteratorInc 類(實現迭代器類)
public class BookShelfIteratorInc extends Iterator {private BookShelf mBookShelf;private int mCurrent;public BookShelfIteratorInc(BookShelf bookShelf) {this.mBookShelf = bookShelf;this.mCurrent = -1; }@Overridepublic Object first() {return mBookShelf.getItems().get(0);}@Overridepublic Object next() {        Object ref = null;          mCurrent++;          if(mCurrent<mBookShelf.getItems().size()){              ref = mBookShelf.getItems().get(mCurrent);          }          return ref;  }@Overridepublic Object currentItem() {        return mBookShelf.getItems().get(mCurrent);  }@Overridepublic boolean hasNext() {        return mCurrent < mBookShelf.getItems().size() -1 ? true : false;  }}

  Main類

 

public class Main {
  
    public static void main(String[] args) {

    BookShelf bookShelf = new BookShelf();
    bookShelf.addBook(new Book("Android"))
        .addBook(new Book("WP"))
        .addBook(new Book("IOS"));
   
    Iterator decIterator = bookShelf.createDecIterator();

        System.out.println("開始順序遍曆");
        while(decIterator.hasNext()){  
            decIterator.next();  
            System.out.println("Book name is: " + ((Book)decIterator.currentItem()).getName());  
        }  

    Iterator incIterator = bookShelf.createIncIterator();
        System.out.println("開始倒序遍曆");
        while(incIterator.hasNext()){  
        incIterator.next();  
            System.out.println("Book name is: " + ((Book)incIterator.currentItem()).getName());  
        }  
    }
}

 

上面執行的結果:

開始順序遍曆
Book name is: IOS
Book name is: WP
Book name is: Android
開始倒序遍曆
Book name is: Android
Book name is: WP
Book name is: IOS

更多的功能擴充

  上面講述了遞增和遞減的遍曆方式,也可自行添加其他遍曆方法,如:

  • 由前往後、由後往前的雙向遍曆(Next 、Previous......)
  • 指定一個下標立即得到
  • 等等
參考連結:http://www.cnblogs.com/TerryBlog/archive/2011/07/05/2098666.html
                  http://clq9761.iteye.com/blog/1090186
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.