zoukankan      html  css  js  c++  java
  • 迭代器模式

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

    设计一个打印菜单的系统有两种菜单:PancakeHouseMenu和DinerMenu,


    写一个迭代器接口:

    package cn.iterator.demo;
    
    /**
     * 迭代器接口
     * 
     * @author wy
     * 
     */
    public interface Iterator {
    
    	public boolean hasNext();
    
    	public Object next();
    }
    
    package cn.iterator.demo;
    
    import java.util.ArrayList;
    
    public class PancakeHouseMenu {
    
    	private ArrayList menuItems;
    
    	public PancakeHouseMenu() {
    		menuItems = new ArrayList();
    		addItem("K&B's breakfast", "eggs and toast", true, 2.99);
    		addItem("Regular", "eggs and sausage", false, 3.00);
    		addItem("BlueBerry", "berries", true, 2.88);
    		addItem("Waffles", "waffles", false, 3.01);
    	}
    
    	public void addItem(String name, String desc, Boolean vagetarian,
    			double price) {
    		MenuItem menuItem = new MenuItem(name, desc, vagetarian, price);
    		menuItems.add(menuItem);
    	}
    
    	public Iterator createIterator() {
    		return new PancakeHouseIterator(menuItems);
    	}
    }
    package cn.iterator.demo;
    
    public class DinerMenu {
    
    	private final static int MAX_ITEMS = 6;
    	private int numberOfItems = 0;
    	MenuItem[] menuItems;
    
    	public DinerMenu() {
    		menuItems = new MenuItem[MAX_ITEMS];
    		addItem("BLT", "Fakin", true, 2.14);
    		addItem("XX", "xxc", false, 2.87);
    		addItem("YY", "yy", true, 6.5);
    		addItem("ABC", "abc", true, 5.2);
    	}
    
    	public void addItem(String name, String desc, boolean vagetarian,
    			double price) {
    		MenuItem menuItem = new MenuItem(name, desc, vagetarian, price);
    		if (numberOfItems >= MAX_ITEMS) {
    			System.err.println("Sorry!the menu is full!");
    		} else {
    			menuItems[numberOfItems] = menuItem;
    			numberOfItems++;
    		}
    	}
    
    	/**
    	 * 返回迭代器接口,客户不需要知道餐厅菜单是如何维护菜单项的,也不需要迭代器是如何实现的, 客户只需要直接使用这个迭代器来遍历菜单项即可
    	 * 
    	 * @return
    	 */
    	public Iterator createIterator() {
    		return new DinnerMenuIterator(menuItems);
    	}
    }
    


    package cn.iterator.demo;
    
    public class MenuItem {
    
    	private String name;
    	private String desc;
    	private boolean vagetarian;
    	private double price;
    
    	public MenuItem(String name, String desc, Boolean vagetarian, double price) {
    		this.name = name;
    		this.desc = desc;
    		this.vagetarian = vagetarian;
    		this.price = price;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public String getDesc() {
    		return desc;
    	}
    
    	public boolean getVagetarian() {
    		return vagetarian;
    	}
    
    	public double getPrice() {
    		return price;
    	}
    }
    


    上面是两个菜单类,接着写下两个菜单迭代器:

    package cn.iterator.demo;
    
    import java.util.ArrayList;
    
    public class PancakeHouseIterator implements Iterator {
    
    	private ArrayList<MenuItem> menuItems;
    
    	private int position = 0;
    
    	public PancakeHouseIterator(ArrayList<MenuItem> menuItems) {
    		this.menuItems = menuItems;
    	}
    
    	@Override
    	public boolean hasNext() {
    		// TODO Auto-generated method stub
    		if (position >= menuItems.size() || menuItems.get(position) == null) {
    			return false;
    		} else {
    			return true;
    		}
    	}
    
    	@Override
    	public Object next() {
    		// TODO Auto-generated method stub
    		return menuItems.get(position++);
    	}
    
    }
    
    package cn.iterator.demo;
    
    public class DinnerMenuIterator implements Iterator {
    
    	private MenuItem[] menuItems;
    	int position = 0;
    
    	public DinnerMenuIterator(MenuItem[] menuItems) {
    		this.menuItems = menuItems;
    	}
    
    	@Override
    	public boolean hasNext() {
    		// TODO Auto-generated method stub
    		if (position >= menuItems.length || menuItems[position] == null) {
    			return false;
    		} else {
    			return true;
    		}
    	}
    
    	@Override
    	public Object next() {
    		// TODO Auto-generated method stub
    		return menuItems[position++];
    	}
    
    }
    

    女服务员类:

    package cn.iterator.demo;
    /**
     * 女服务员类:由女服务员来打印菜单
     * @author wy
     *
     */
    public class Waitress {
    
    	PancakeHouseMenu pancakeHouseMenu;
    	DinerMenu dinerMenu;
    
    	public Waitress(PancakeHouseMenu pancakeHouseMenu, DinerMenu dinerMenu) {
    		this.pancakeHouseMenu = pancakeHouseMenu;
    		this.dinerMenu = dinerMenu;
    	}
    
    	public void printMenu() {
    		Iterator panCakeHouseIterator = pancakeHouseMenu.createIterator();
    		Iterator dinerMenuIterator = dinerMenu.createIterator();
    		System.out.println("BreakFast Menu:");
    		print(panCakeHouseIterator);
    		System.out.println("Dinner Menu:");
    		print(dinerMenuIterator);
    	}
    
    	private void print(Iterator it) {
    		while (it.hasNext()) {
    			MenuItem menuItem = (MenuItem) it.next();
    			System.out.print("name:" + menuItem.getName());
    			System.out.print("---desc:" + menuItem.getDesc());
    			System.out.println("---price:" + menuItem.getPrice());
    		}
    		System.out.println();
    	}
    }
    
    测试类:

    package cn.iterator.demo;
    
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    
    public class Test {
    
    	public static void main(String[] args) {
    		PancakeHouseMenu pancakeHouseMenu = new PancakeHouseMenu();
    		DinerMenu dinerMenu = new DinerMenu();
    
    		pancakeHouseMenu.addItem("140106", "140106", true, 100);
    		dinerMenu.addItem("140106", "140106", false, 99);
    
    		Waitress waitress = new Waitress(pancakeHouseMenu, dinerMenu);
    		waitress.printMenu();
    	}
    }



  • 相关阅读:
    文件的权限
    正则表达式
    软硬链接的学习
    linux系统中的文件类型和扩展名
    把数组排成最小的数
    整数中1出现的次数(从1到n整数中1出现的次数)
    最小的K个数
    连续子数组的最大和
    数组中出现次数超过一半的数字
    字符串的排列
  • 原文地址:https://www.cnblogs.com/wyang0126/p/5039912.html
Copyright © 2011-2022 走看看