【設計模式】學習筆記12:迭代器模式(Iterator)

來源:互聯網
上載者:User

本文出自   http://blog.csdn.net/shuangde800

 

走進迭代器模式

迭代器幾乎是最常用的一種設計模式,在各物件導向語言中都有實現。


1.  迭代器首先需要一個迭代器的介面:


public interface Iterator {    boolean hasNext(); // 會返回一個布爾值,讓我們知道是否還有更多的元素    Object next();  // next()方法會返回下一個元素}

一旦我們有了這個介面,就可以為各種對象集合實現迭代器:數組,列表,散列表……


2. 封裝一個數組的迭代器,並且假設這個數組是給某個餐廳的菜單服務:

public class DinerMenuIterator implements Iterator {    MenuItem[] items;    int position = 0;    public DinerMenuIterator(MenuItem[] items) {        this.items = items;    }    // next()方法返回數組內的下一項,並遞增其位置    public Object next() {        MenuItem menuItem = items[position];        position = position + 1;        return menuItem;    }    // hasNext()方法會檢查我們是否已經取得數組內的所有元素    public boolean hasNext() {        if (position >= items.length || items[position] == null) {            return false;        } else {            return true;        }    }}

3. 把迭代器組合進菜單。  

public class DinerMenu implements Menu {    static final int MAX_ITEMS = 6;    int numberOfItems = 0;    MenuItem[] menuItems;      public DinerMenu() {        menuItems = new MenuItem[MAX_ITEMS];    }      public void addItem(String name, String description,                          boolean vegetarian, double price)     {        MenuItem menuItem = new MenuItem(name, description, vegetarian, price);        if (numberOfItems >= MAX_ITEMS) {            System.err.println("Sorry, menu is full!  Can't add item to menu");        } else {            menuItems[numberOfItems] = menuItem;            numberOfItems = numberOfItems + 1;        }    }     public MenuItem[] getMenuItems() {        return menuItems;    }      // 這個方法擷取菜單的迭代器    public Iterator createIterator() {        return new DinerMenuIterator(menuItems);    }     // other menu methods here}

5. 我們要列印出這個菜單的內容,只需要擷取它的迭代器即可遍曆出所有的功能表項目,並且輸出:

public class Waitress {    // 這個方法為每個菜單各自建立一個迭代器    public void printMenu() {        Iterator dinerIterator = dinerMenu.createIterator(); // 擷取迭代器        printMenu(dinerIterator); // 調用printMenu遍曆迭代器輸出內容    }     private void printMenu(Iterator iterator) {        while (iterator.hasNext()) {            MenuItem menuItem = (MenuItem)iterator.next();            System.out.print(menuItem.getName() + ", ");            System.out.print(menuItem.getPrice() + " -- ");            System.out.println(menuItem.getDescription());        }    }}

通過引入迭代器,菜單的實現已經被封裝起來,Waitress類不知道菜單是如何儲存功能表項目集合的。

有了迭代器,我們只需要一個迴圈,就可以多態地處理任何項的集合。

而且Waitress類現在只使用一個介面(迭代器)


定義迭代器模式

迭代器模式提供一種方法順序訪問一個彙總對象中的各個元素,而不是暴露出其內部的表示。


迭代器模式能夠讓我們遊走於彙總內的沒一個元素,而又不暴露其內部的表示

把遊走的任務放在迭代器上,而不是彙總上。這樣簡化了彙總的介面和實現,也讓責任各得其所。



設計原則:單一責任

一個類應該只有一個引起變化的原因


我們知道要避免類內的改變,因為修改代碼很容易造成許多潛在的錯誤。如果一個類具有兩個改變的原因,那麼這會使得將來該類的變化幾率上升,而當它真的改變時,你的設計中同時有兩個方面將會受到影響



內聚:用來度量一個類或模板緊密地達到單一目的或責任。當一個模板或一個類設計只支援一組相關的功能時,我們說它具有高內聚;反之具有低內聚。


迭代器意味著沒有次序。只是取出所有的元素,並不表示取出元素的先後就代表元素的大小次序。對於迭代器來說,資料結構可以是有次序的,也可以是沒有次序的,甚至資料可以是重複。除非某些集合有特別說明,否則不對迭代器取出的元素大小次序作出假設




聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.