迭代器模式(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:一个类应该只有一个引起变化的原因

重点:尽量让类保持单一责任


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值