【设计模式】迭代器模式

版权声明:转载请注明出处: https://blog.csdn.net/qq_21687635/article/details/84958770

模式定义

迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。

下图是该模式的类图:
迭代器模式类图

一个生动的例子

迭代器接口:
public interface Iterator<E> {
	boolean hasNext();

	E next();
}

聚合体接口:
public interface Menu<T> {
	Iterator<T> createIterator();
}

聚合体具体类:
public class DinerMenu implements Menu<MenuItem> {
	private static final int MAX_ITEMS = 4;
	private int numberOfItems = 0;
	private MenuItem[] menuItems;

	public DinerMenu() {
		menuItems = new MenuItem[MAX_ITEMS];

		addItem("Diner A", "Diner A", true, 2.99);
		addItem("Diner B", "Diner B", false, 3.99);
		addItem("Diner C", "Diner C", true, 4.99);
		addItem("Diner D", "Diner D", false, 5.99);
	}

	public void addItem(String name, String description, boolean vegetarian, double price) {
		if (numberOfItems >= MAX_ITEMS) {
			System.err.println("sorry, menu is full! can't add item to menu");
		} else {
			MenuItem menuItem = new MenuItem(name, description, vegetarian, price);
			menuItems[numberOfItems] = menuItem;
			numberOfItems++;
		}
	}

	@Override
	public Iterator<MenuItem> createIterator() {
		return new DinerMenuIterator(menuItems);
	}
}

迭代器具体类:
public class DinerMenuIterator implements Iterator<MenuItem> {

	private MenuItem[] items;
	int position = 0;

	public DinerMenuIterator(MenuItem[] menuItems) {
		this.items = menuItems;
	}

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

	@Override
	public MenuItem next() {
		MenuItem menuItem = items[position];
		position++;
		return menuItem;
	}

}

客户端类:
public class Waitress {
	private DinerMenu dinerMenu;

	public Waitress(DinerMenu dinerMenu) {
		this.dinerMenu = dinerMenu;
	}

	public void printMenu() {
		Iterator<MenuItem> dinerIterator = dinerMenu.createIterator();

		System.out.println("\n----- dinerItems -----");
		printMenu(dinerIterator);
	}

	private void printMenu(Iterator<MenuItem> iterator) {
		while (iterator.hasNext()) {
			MenuItem menuItem = iterator.next();
			System.out.println(menuItem);
		}
	}

}

其实Java源码中也有相应的接口,Iterable接口相当于上面的聚合体接口,也就是对应的Menu接口;Iterator接口相当于上面的迭代器接口,也就是对应的Iterator接口。

参考

  1. Head First 设计模式[书籍]

猜你喜欢

转载自blog.csdn.net/qq_21687635/article/details/84958770