設計模式之迭代器與組合模式(二)

在上次的文章中,我們通過層層引導,已經知道了迭代器模式的由來。現在我們再好好總結下。

關于迭代器模式,你所需要知道的第一件事情,就是它依賴于一個名為迭代器的接口。這是一個可能的迭代器的接口:

現在,我們一旦有了這個接口,就可以為各種對象集合實現迭代器:數組、列表、散列表...如果我么想要為數組實現迭代器,以便使用在DinerMenu中,看起來就像這樣:

在餐廳菜單中加入一個迭代器

想要在餐廳菜單中加入一個迭代器,我們需要先定義迭代器接口:

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

現在我們需要實現一個具體的迭代器,為餐廳菜單服務:

public class DinerMenuIterator implements Iterator {
MenuItem[] items;
int position = 0;
 
public DinerMenuIterator(MenuItem[] items) {
this.items = items;
}
 
public MenuItem next() {
MenuItem menuItem = items[position];
position = position + 1;
return menuItem;
}
 
public boolean hasNext() {
if (position >= items.length || items[position] == null) {
return false;
} else {
return true;
}
}
}

接下來,我們改寫下餐廳菜單:

public Iterator createIterator() {
    return new DinerMenuIterator(menuItems);
// To test Alternating menu items, comment out above line,
// and uncomment the line below.
//return new AlternatingDinerMenuIterator(menuItems);
}

我們需要將迭代器代碼整合進服務員中。我們應該擺脫原本冗余的部分。整合的做法相當直接:首先創建一個printMenu()方法,傳入一個迭代器當做此方法的參數,然后對每一個菜單都是用createIterator()方法來檢索迭代器,并將迭代器傳入新方法。

public class Waitress {
Menu pancakeHouseMenu;
Menu dinerMenu;
 
public Waitress(Menu pancakeHouseMenu, Menu dinerMenu) {
this.pancakeHouseMenu = pancakeHouseMenu;
this.dinerMenu = dinerMenu;
}
 
public void printMenu() {
Iterator pancakeIterator = pancakeHouseMenu.createIterator();
Iterator dinerIterator = dinerMenu.createIterator();

System.out.println("MENU\n----\nBREAKFAST");
printMenu(pancakeIterator);
System.out.println("\nLUNCH");
printMenu(dinerIterator);

}
 
private void printMenu(Iterator iterator) {
while (iterator.hasNext()) {
MenuItem menuItem = iterator.next();
System.out.print(menuItem.getName() + ", ");
System.out.print(menuItem.getPrice() + " -- ");
System.out.println(menuItem.getDescription());
}
}
// 此處省略其他方法
}

熟悉Java的同學應該知道,其實Java有自帶的迭代器接口。但是,我在這里為什么不這么做呢,是為了讓我們更好地了解如何從頭創建一個迭代器。現在目的達到了,所以就要改變做法,把之前自定義的迭代器改成Java的Iterator接口即可,在這里就不進行具體描述啦,詳情請看源碼即可。

定義迭代器模式

現在我們已經知道了如何用自己的迭代器來實現迭代器模式,也看到了Java是如何在某些面向聚合的類中(入ArrayList)支持迭代器的。現在我們就來看看這個模式真的正式定義:

迭代器模式提供一種方法順序訪問一個聚合對象中的各個元素,而又不暴露其內容的表示。

這個模式給你提供了一種方法,可以順序訪問一個聚集對象中的元素,而又不用知道內部是如何表示的。在設計中使用迭代器的影響是明顯的:如果你有一個統一的方法訪問聚合中的每一個對象,你就可以編寫多態的代碼和這些聚合搭配,使用--如同前面的printMenu()方法一樣,只要有了迭代器這個方法根本不管菜單項究竟是有由數組還是ArrayList來保存的。

另一個對你設計造成重要影響的,是迭代器模式把元素之間游走的責任交給迭代器,而不是聚合對象。這不僅讓聚合的接口和實現變得更簡潔,也可以讓聚合更專注在它所應該專注的事情上面,而不必去理會遍歷的事情。

讓我們檢查類圖,將來龍去脈拼湊出來

至此,迭代器模式我們就差不多都了解啦。但是,接下來,我們還會介紹組合模式,它為什么要和迭代器模式放在同一個章節里面呢?我們下回分曉。

愛生活,愛學習,愛感悟,愛挨踢

免責聲明:本文僅代表文章作者的個人觀點,與本站無關。其原創性、真實性以及文中陳述文字和內容未經本站證實,請讀者僅作參考,并自行核實相關內容。如發現有害或侵權內容,請聯系郵箱:jubao@pinlue.com,我們將在第一時間進行核實處理。

http://image95.pinlue.com/image/14.jpg
分享
評論
首頁
暖暖高清在线观看视频桃花社区视频在线观看播放