迭代器模式(Iterator Pattern)

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


案例:菜單項目的打印


代碼:

public interface Menu {
	public Iterator createIterator();
}

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

public class DinerMenu implements Menu {
	
	private final static int MAX_ITEMS = 6;
	private int numberOfItems = 0;
	private MenuItem[] menuItems;

	public DinerMenu() {
		menuItems = new MenuItem[MAX_ITEMS];
		
		addItem("Vegetarian BLT", "", true, 2.99);
		addItem("BLT", "", false, 2.99);
		addItem("Hotdog", "", false, 3.29);
	}
	
	public void addItem(String name, String description, boolean vegetarian, double price) {
		MenuItem menuItem = new MenuItem(name, description, vegetarian, price);
		if (numberOfItems >= MAX_ITEMS) {
			System.out.println("Sorry, menu is full!");
		} else {
			menuItems[numberOfItems] = menuItem;
			numberOfItems += 1;
		}
	}
	
	@Override
	public Iterator createIterator() {
		return new DinerMenuIterator(menuItems);
	}
}

public class DinerMenuIterator implements Iterator {
	
	private MenuItem[] menuItems;
	private int position;
	
	public DinerMenuIterator(MenuItem[] items) {
		menuItems = items;
		position = 0;
	}

	@Override
	public boolean hasNext() {
		if (position >= menuItems.length || menuItems[position] == null) {
			return false;
		} 
		return true;
	}

	@Override
	public Object next() {
		MenuItem item = menuItems[position];
		position += 1;
		return item;
	}
}

public class PatternDemo {
	
	public static void main(String[] args) {
		print(new DinerMenu());
	}
	
	public static void print(Menu menu) {
		Iterator i = menu.createIterator();
		while (i.hasNext()) {
			MenuItem item = (MenuItem)i.next();
			System.out.println("Name: " + item.getName()
					+ ", Price: " + item.getPrice());
		}
	}
}

當然,其實JDK裏面已經提供了java.util.Iterator接口供我們使用,同樣可以用DinerMenuIterator類實現這個接口,然後實現hasNext(), next(), remove()三個方法

注,remove()是指移除調用了next()後返回的那個值的那一項。


另外,如果在類中使用的不是數組結構,而是JDK裏面提供的容器類,例如ArrayList,或者LinkedList,那麼它們本身就已經實現了java.util.Iterator,因此在在返回Iterator方法中可以直接調用JDK實現好的,例如:

import java.util.ArrayList;
import java.util.Iterator;

public class PancakeHouseMenu {

	private ArrayList<MenuItem> list;
	
	public PancakeHouseMenu() {
		list = new ArrayList<MenuItem>();
		
		addItem("Vegetarian BLT", "", true, 2.99);
		addItem("BLT", "", false, 2.99);
		addItem("Hotdog", "", false, 3.29);
	}
	
	public void addItem(String name, String description, boolean vegetarian, double price) {
		MenuItem menuItem = new MenuItem(name, description, vegetarian, price);
		list.add(menuItem);
	}
	
	public Iterator createIterator() {
		return list.iterator();
	}
}

設計原則9:一個類應該只有一個引起變化的原因

重點:儘量讓類保持單一責任


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章