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

在上次的文章中,咱們經過層層引導,已經知道了迭代器模式的由來。如今咱們再好好總結下。數組

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

如今,咱們一旦有了這個接口,就能夠爲各類對象集合實現迭代器:數組、列表、散列表...若是我麼想要爲數組實現迭代器,以便使用在DinerMenu中,看起來就像這樣:this

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

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

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;
		}
	}
}
複製代碼

接下來,咱們改寫下餐廳菜單:3d

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()方法來檢索迭代器,並將迭代器傳入新方法。code

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接口便可,在這裏就不進行具體描述啦,詳情請看源碼便可。cdn

定義迭代器模式

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

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

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

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

讓咱們檢查類圖,未來龍去脈拼湊出來

至此,迭代器模式咱們就差很少都瞭解啦。可是,接下來,咱們還會介紹組合模式,它爲何要和迭代器模式放在同一個章節裏面呢?咱們下回分曉。

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

相關文章
相關標籤/搜索