提供一种方法顺序访问一个集合中的各个元素,而又不暴露其内部实现。
演示了迭代器模式,遍历餐厅菜单的例子
/**
* 菜单项
* @author huangy on 2019-06-07
*/
public class MenuItem {
private String name;
private String description;
private boolean vegetarian;
private double price;
public MenuItem(String name, String description, boolean vegetarian, double price) {
this.name = name;
this.description = description;
this.vegetarian = vegetarian;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public boolean isVegetarian() {
return vegetarian;
}
public void setVegetarian(boolean vegetarian) {
this.vegetarian = vegetarian;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "MenuItem{" +
"name='" + name + '\'' +
", description='" + description + '\'' +
", vegetarian=" + vegetarian +
", price=" + price +
'}';
}
}
/**
* 餐厅菜单
* @author huangy on 2019-06-07
*/
public class DinerMenu {
private MenuItem[] menuItems;
{
menuItems = new MenuItem[3];
menuItems[0] = new MenuItem("name1", "desc1", true, 1);
menuItems[1] = new MenuItem("name2", "desc2", false, 2);
menuItems[2] = new MenuItem("name3", "desc3", true, 3);
}
/**
* 返回迭代器接口
* (1)客户不需要知道餐厅菜单是如何维护菜单项的,也不需要知道迭代器是如何实现的。
* 客户只需要使用这个迭代器遍历元素就可以了。
*/
public Iterator createIterator() {
return new DinerMenuIterator(menuItems);
}
}
/**
* 菜单项迭代器
* @author huangy on 2019-06-07
*/
public class DinerMenuIterator implements Iterator {
MenuItem[] items;
int position;
public DinerMenuIterator(MenuItem[] items) {
this.items = items;
}
@Override
public Object next() {
MenuItem menuItem = items[position];
position = position + 1;
return menuItem;
}
@Override
public boolean hasNext() {
return ((position < items.length) && (items[position] != null));
}
}
/**
* 迭代器接口
* @author huangy on 2019-06-07
*/
public interface Iterator {
boolean hasNext();
Object next();
}
/**
* 女招待员
* @author huangy on 2019-06-08
*/
public class Waitress {
DinerMenu dinerMenu;
public Waitress(DinerMenu dinerMenu) {
this.dinerMenu = dinerMenu;
}
public void printMenu() {
Iterator iterator = dinerMenu.createIterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
/**
* @author huangy on 2019-06-08
*/
public class DemoTest {
public static void main(String[] args) {
DinerMenu dinerMenu = new DinerMenu();
Waitress waitress = new Waitress(dinerMenu);
waitress.printMenu();
}
}