迭代器模式
迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示
迭代器模式让我们能游走于聚合内的每一个元素,而又不暴露其内部的表示。
把游走的任务放在迭代器上,而不是聚合上。这样简化了聚合的接口和实现,也让责任各得其所。
代码
/**
* 菜单类
* 定义 菜单名称、描述、是否为素食和价格
*
*/
public class MenuItem {
String name;
String description;
//是否为素食标识
Boolean vegetarian;
double price ;
public MenuItem(String name, String description, Boolean vegetarian, double price) {
super();
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 getVegetarian() {
return vegetarian;
}
public void setVegetarian(Boolean vegetarian) {
this.vegetarian = vegetarian;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
/**
* @author lzlj21@163.com
*
* 这是一个简单接口,让客户能够取得一个菜单项迭代器
*
*/
public interface Menu {
public Iterator createItterator();
}
/**
* @author lzlj21@163.com
*
*定义arralist存储菜单的菜单类
*/
public class PancakeHouseMenu implements Menu {
ArrayList menuItms; //使用一个arraylist存储菜单项
/**
* 初始化菜单是添加菜单项
*/
public PancakeHouseMenu() {
menuItms= new ArrayList<>();
/**
* 简化菜单内容
*/
additem("name1","description1",true,2.99);
additem("name2","description2",true,3.99);
additem("name3","description3",true,4.99);
additem("name4","description4",true,5.99);
additem("name5","description5",true,6.99);
additem("name6","description6",true,7.99);
additem("name7","description7",true,8.99);
}
/**
* 添加菜单项
*
* @param name
* @param description
* @param vegetarian
* @param price
*/
private void additem(String name, String description, boolean vegetarian, double price) {
MenuItem item =new MenuItem(name, description, vegetarian, price);
menuItms.add(item);
}
/*
* 调用菜单项arraylist的iterator方法
*/
@Override
public Iterator createItterator() {
return menuItms.iterator();
}
}
/**
* @author lzlj21@163.com
*
*餐厅菜单迭代器类
*/
public class DinerMenuIterator implements Iterator<Menu> {
MenuItem[] items;
int position; // 记录当前数组遍历 的位置
/**
* @param items 传入一个菜单项的数组当做参数
*/
public DinerMenuIterator(MenuItem[] items) {
this.items = items;
}
/*
* 检查我们是否已经取得数组内所以的元素,如果还有元素待遍历,则返回true。
*/
@Override
public boolean hasNext() {
/*
* 因为是使用固定长度的数组,所以我们不但要检查是否超出了数组长度,
* 也必须检查是否下一项是null,如果是null,就表示没有其他项了。
*/
if (position<=items.length||items[position]==null) {
return false;
}else{
return true;
}
}
@Override
public Menu next() {
// TODO Auto-generated method stub
return null;
}
}
/**
* @author lzlj21@163.com
*
*定义arralist存储菜单的菜单类
*/
public class DinerMenu implements Menu {
static final int MAX_ITEMS=6; // 控制菜单长度
int numberOfItems=0; //菜单计数器
MenuItem [] menuItems; //菜单存储在数组中
/**
* 初始化菜单是添加菜单项
*/
public DinerMenu() {
menuItems= new MenuItem[MAX_ITEMS];
/**
* 简化菜单内容
*/
additem("name1","description1",true,2.99);
additem("name2","description2",true,3.99);
additem("name3","description3",true,4.99);
additem("name4","description4",true,5.99);
additem("name5","description5",true,6.99);
additem("name6","description6",true,7.99);
additem("name7","description7",true,8.99);
}
/**
* 添加菜单项
*
* @param name
* @param description
* @param vegetarian
* @param price
*/
private void additem(String name, String description, boolean vegetarian, double price) {
MenuItem item =new MenuItem(name, description, vegetarian, price);
//监测是否超出菜单长度
if (numberOfItems >=MAX_ITEMS) {
System.out.println("sorry,nenu is full! can't add item to menu");
} else {
menuItems[numberOfItems]=item;
numberOfItems++;
}
}
/*
* 调用菜单项arraylist的iterator方法
*/
@Override
public Iterator createItterator() {
return new DinerMenuIterator(menuItems);
}
}
/**
* @author lzlj21@163.com
*
*定义一个女招待类
*打印菜单
*/
public class Waitress {
Menu pancakeHouseMenu;
Menu dinnerMenu;
//将菜单项的接口传入,和女招待类解耦合
public Waitress(Menu pancakeHouseMenu, Menu dinnerMenu) {
this.pancakeHouseMenu = pancakeHouseMenu;
this.dinnerMenu = dinnerMenu;
}
/**
* 打印菜单
*/
public void printMenu(){
Iterator pancakeIteator = pancakeHouseMenu.createItterator();
Iterator dinneIterator = dinnerMenu.createItterator();
System.out.println("Menu\n-----\n BREAKFAST");
priintMenu(pancakeIteator);
System.out.println("\n LUNCH");
priintMenu(dinneIterator);
}
/**
* 循环打印菜单项
* @param iteator
*/
private void priintMenu(Iterator iteator) {
while (iteator.hasNext()) {
MenuItem menuItem = (MenuItem) iteator.next();
System.out.println(menuItem.getName()+", ");
System.out.println(menuItem.getPrice()+" -- ");
System.out.println(menuItem.getDescription());
}
}
}
public class MenuTestDrive {
public static void main(String[] args) {
PancakeHouseMenu pancakeHouseMenu=new PancakeHouseMenu();
DinerMenu dinerMenu =new DinerMenu();
//传入菜单
Waitress waitress=new Waitress(pancakeHouseMenu, dinerMenu);
//打印菜单
waitress.printMenu();
}
}