注册 | 登录 忘记密码? 51cto首页 | 博客 | 论坛 | 招聘
热点文章 Exchange服务器系列课程之..
 帮助

迭代模式


2008-03-17 23:01:54
 标签:迭代 模式    [推送到技术圈]

版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://sophi.blog.51cto.com/340461/66348
import java.util.*;

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


public class MyIterator {

    public static void main(String[] args) {
  ArrayList list = new ArrayList();
  list.add(new DinerMenu());
  list.add(new PancakeHouseMenu());
  
  Waitress waitress = new Waitress(list);
  waitress.printMenu();
    }

}

//菜单项结构
class MenuItem{
    String name;
    String description;
    boolean vegetarian;
    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 String getDescription() {
  return description;
    }
  
    public double getPrice() {
  return price;
    }
  
    public boolean isVegetarian() {
  return vegetarian;
    }
}

//抽象菜单
interface Menu{
    public Iterator createIterator();
}

//具体菜单
class DinerMenu implements Menu{
    static final int MAX_ITEMS = 6;
    int numberOfItems = 0;
    MenuItem[] menuItems;
  
    public DinerMenu(){
  menuItems = new MenuItem[MAX_ITEMS];
  
  addItem("Hotdog","A hot dog,with relish",false,3.05);
    }
  
    public void addItem(String name,String description,boolean vegetarian,double price) {
  MenuItem menuItem = new MenuItem(name,description,vegetarian,price);
  if(numberOfItems >= MAX_ITEMS){
      System.err.println("Sorry,menu is full!");
  } else{
      menuItems[numberOfItems] = menuItem;
      numberOfItems = numberOfItems + 1;
  }
    }

    //必须实现
    public Iterator createIterator() {
  return new DinerMenuIterator(menuItems);
    }
  
}

class PancakeHouseMenu implements Menu{
    ArrayList menuItems;
  
    public PancakeHouseMenu(){
  menuItems = new ArrayList();
  
  addItem("Waffles","Waffles,with your blue berries",true,3.59);
    }
  
    public void addItem(String name,String description,boolean vegetarian,double price){
  MenuItem menuItem = new MenuItem(name,description,vegetarian,price);
  menuItems.add(menuItem);
    }

    //直接利用java容器自带的iterator来实现
    public Iterator createIterator() {
  return menuItems.iterator();
    }
}

//利用java自带的Iterator接口,必须实现next(),hasNext(),remove()
class DinerMenuIterator implements Iterator{
    MenuItem[] items;
    int position = 0;
  
    public DinerMenuIterator(MenuItem[] items){
  this.items = items;
    }
  
    public Object next(){
  MenuItem menuItem = items[position];
  position = position + 1;
  return menuItem;
    }
  
    public boolean hasNext(){
  if (position >= items.length || items[position] == null){
      return false;
  } else {
      return true;
  }
    }
  
    public void remove(){
  throw new UnsupportedOperationException();
    }
}

//一个不错的遍历对象的类
class Waitress{
    ArrayList menus;
  
    public Waitress(ArrayList menus){
  this.menus = menus;
    }
  
    public void printMenu(){
  Iterator menuIterator = menus.iterator();
  while(menuIterator.hasNext()){
      Menu menu = (Menu)menuIterator.next();
      printMenu(menu.createIterator());
  }
    }
  
    void printMenu(Iterator iterator){
  while (iterator.hasNext()) {
      MenuItem menuItem = (MenuItem) iterator.next();
      System.out.println(menuItem.getName());
      System.out.println(menuItem.getPrice());
      System.out.println(menuItem.getDescription());
  }
    }
}

本文出自 ““技”忆” 博客,请务必保留此出处http://sophi.blog.51cto.com/340461/66348



上一篇 状态模式  下一篇 代理模式



    文章评论
 
 

发表评论

昵   称:
验证码:  点击图片可刷新验证码  博客过2级,无需填写验证码
内   容: