迭代器模式:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
类图:
使用迭代器模式,实现了烤鱼菜单,类图:
MenuItem类代码实现:
public class MenuItem {
String name;
public MenuItem(String name){
this.name = name;
}
public String getname(){
return name;
}
}
接口Iterator代码实现:
public interface Iterator {
public boolean hasNext();
public Object next();
public void remove();
}
类FishIterator代码实现:
public class FishIterator implements Iterator{
MenuItem[] items;
int position = 0;
public FishIterator(MenuItem[] items){
this.items = items;
}
@Override
public boolean hasNext() {
// TODO Auto-generated method stub
if (position >=items.length || items[position] == null) {
return false;
}else {
return true;
}
}
@Override
public Object next() {
// TODO Auto-generated method stub
MenuItem menuItem = items[position];
position = position + 1;
return menuItem;
}
@Override
public void remove() {
// TODO Auto-generated method stub
for (int i = position; i < (items.length -1); i++) {
items[i] = items[i+1];
}
items[items.length - 1] = null;
}
}
接口Menu代码实现:
public interface Menu {
public Iterator createIterator();
}
类FishMenu代码实现:
public class FishMenu implements Menu{
MenuItem[] items;
static final int MAX_ITEMS = 6;
int numberOfItems = 0;
public FishMenu(){
items = new MenuItem[MAX_ITEMS];
addItem("烤鲫鱼");
addItem("烤草鱼");
addItem("烤大头鱼");
addItem("烤秋刀鱼");
addItem("烤鲨鱼");
}
public void addItem(String name){
MenuItem menuItem = new MenuItem(name);
if (numberOfItems >= MAX_ITEMS) {
System.out.println("Sorry,menu if full!can't add item to menu");
}else {
//System.out.println("menuItem="+menuItem);
items[numberOfItems] = menuItem;
numberOfItems = numberOfItems + 1;
}
}
@Override
public Iterator createIterator() {
// TODO Auto-generated method stub
return new FishIterator(items);
}
}
类Client代码实现:
public class Client {
Menu fisMenu;
public Client(Menu fishMenu){
this.fisMenu = fishMenu;
}
public void printMenu(){
Iterator fishIterator = fisMenu.createIterator();
printMenu(fishIterator);
}
public void printMenu(Iterator iterator){
while (iterator.hasNext()) {
MenuItem menuItem = (MenuItem)iterator.next();
System.out.println(menuItem.getname());
}
}
}
测试类MenuTest代码实现:
public class MenuTest {
public static void main(String[] args){
Menu fishMenu = new FishMenu();
Client client = new Client(fishMenu);
client.printMenu();
}
}
执行结果:
烤鲫鱼
烤草鱼
烤大头鱼
烤秋刀鱼
烤鲨鱼