• JAVA设计模式学习笔记-迭代器模式


    两个菜馆合并后的菜单问题

    蛋糕店与餐厅合并后,怎么统一管理菜单项目
    问题:一个用ArrayList管理菜单,一个用数组管理

    传统设计

    菜单项

    package com.java.jikexueyuan.iteratormode;
    
    public class MenuItem {
    	private String name,description;
    	private boolean vegetable;
    	private float price;
    	public MenuItem(String name,String description,boolean vegetable,float price)
    	{
    		this.name=name;
    		this.description=description;
    		this.vegetable=vegetable;
    		this.price=price;
    		
    	}
    	public String getName()
    	{
    		return name;
    	}
    	public String getDescription()
    	{
    		return description;
    	}
    	public float getPrice()
    	{
    		return price;
    	}
    	public boolean  isVegetable()
    	{
    		return vegetable;
    	}
    }
    

    蛋糕店菜单

    package com.java.jikexueyuan.iteratormode;
    
    import java.util.ArrayList;
    
    public class CakeHouseMenu {
    	private ArrayList<MenuItem> menuItems;
    
    	public CakeHouseMenu() {
    		menuItems = new ArrayList<MenuItem>();
    		
    		addItem("KFC Cake Breakfast","boiled eggs&toast&cabbage",true,3.99f);
    		addItem("MDL Cake Breakfast","fried eggs&toast",false,3.59f);
    		addItem("Stawberry Cake","fresh stawberry",true,3.29f);
    		addItem("Regular Cake Breakfast","toast&sausage",true,2.59f);
    	}
    
    	private void addItem(String name, String description, boolean vegetable,
    			float price) {
    		MenuItem menuItem = new MenuItem(name, description, vegetable, price);
    		menuItems.add(menuItem);
    	}
    	public ArrayList<MenuItem> getMenuItems() {
    		return menuItems;
    	}
    	
    	//其他功能代码
    }
    

    餐馆菜单

    package com.java.jikexueyuan.iteratormode;
    
    import java.util.ArrayList;
    
    public class DinerMenu {
    	private final static int Max_Items=5;
    	public int numberOfItems=0;
    	private MenuItem[] menuItems;
    	
    	public DinerMenu()
    	{
    		menuItems=new MenuItem[Max_Items] ;
    		addItem("vegetable Blt","bacon&lettuce&tomato&cabbage",true,3.58f);
    		addItem("Blt","bacon&lettuce&tomato",false,3.00f);
    		addItem("bean soup","bean&potato salad",true,3.28f);
    		addItem("hotdog","onions&cheese&bread",false,3.05f);
    		
    		
    	}
    	private void addItem(String name, String description, boolean vegetable,
    			float price) {
    		MenuItem menuItem = new MenuItem(name, description, vegetable, price);
    		if(numberOfItems>=Max_Items)
    		{
    			System.err.println("sorry,menu is full!can not add another item");
    		}else{
    			menuItems[numberOfItems]=menuItem;
    			numberOfItems++;
    		}
    		
    	}
    	
    	public MenuItem[] getMenuItems() {
    		return menuItems;
    	}
    }
    

    女招待

    package com.java.jikexueyuan.iteratormode;
    
    import java.util.ArrayList;
    
    public class Waitress {
    	private CakeHouseMenu mCakeHouseMenu;
    	private DinerMenu mDinerMenu;
    	private ArrayList<MenuItem> cakeitems;
    	private MenuItem[] dineritems;
    
    	
    	
    	public Waitress() {
    		mCakeHouseMenu = new CakeHouseMenu();
    		cakeitems = mCakeHouseMenu.getMenuItems();
    
    		mDinerMenu = new DinerMenu();
    		dineritems = mDinerMenu.getMenuItems();
    	}
    
    	public void printMenu() {
    		MenuItem menuItem;
    		for (int i = 0, len = cakeitems.size(); i < len; i++) {
    			menuItem = cakeitems.get(i);
    			System.out.println(menuItem.getName() + "***"
    					+menuItem.getPrice()+"***"+ menuItem.getDescription());
    
    		}
    		for (int i = 0, len = mDinerMenu.numberOfItems; i < len; i++) {
    			menuItem = dineritems[i];
    			System.out.println(menuItem.getName() + "***"
    					+menuItem.getPrice()+"***"+ menuItem.getDescription());
    
    		}
    
    	}
    
    	public void printBreakfastMenu() {
    
    	}
    
    	public void printLunchMenu() {
    
    	}
    
    	public void printVegetableMenu() {
    
    	}
    }
    

    迭代器模式

    封装遍历,迭代器接口
    用迭代器接口改造菜单
    迭代器模式:提供一种方法顺序访问一个聚合对象中的各个对象

    迭代器接口

    package com.java.jikexueyuan.iteratormode.iterator;
    
    public interface Iterator {
    	
    	public boolean hasNext();
    	public Object next();
    
    }
    

    实现迭代器接口

    package com.java.jikexueyuan.iteratormode.iterator;
    
    import java.util.ArrayList;
    
    import com.java.jikexueyuan.iteratormode.MenuItem;
    
    public class DinerMenu {
    	private final static int Max_Items = 5;
    	private int numberOfItems = 0;
    	private MenuItem[] menuItems;
    
    	public DinerMenu() {
    		menuItems = new MenuItem[Max_Items];
    		addItem("vegetable Blt", "bacon&lettuce&tomato&cabbage", true, 3.58f);
    		addItem("Blt", "bacon&lettuce&tomato", false, 3.00f);
    		addItem("bean soup", "bean&potato salad", true, 3.28f);
    		addItem("hotdog", "onions&cheese&bread", false, 3.05f);
    
    	}
    
    	private void addItem(String name, String description, boolean vegetable,
    			float price) {
    		MenuItem menuItem = new MenuItem(name, description, vegetable, price);
    		if (numberOfItems >= Max_Items) {
    			System.err.println("sorry,menu is full!can not add another item");
    		} else {
    			menuItems[numberOfItems] = menuItem;
    			numberOfItems++;
    		}
    
    	}
    
    	public Iterator getIterator() {
    		return new DinerIterator();
    	}
    
    	class DinerIterator implements Iterator {
    		private int position;
    
    		public DinerIterator() {
    			position = 0;
    		}
    
    		@Override
    		public boolean hasNext() {
    			// TODO Auto-generated method stub
    			if (position < numberOfItems) {
    				return true;
    			}
    			
    			return false;
    		}
    
    		@Override
    		public Object next() {
    			// TODO Auto-generated method stub
    			MenuItem menuItem = menuItems[position];
    			position++;
    			return menuItem;
    		}
    	};
    }
    
    package com.java.jikexueyuan.iteratormode.iterator;
    
    import java.util.ArrayList;
    
    import com.java.jikexueyuan.iteratormode.MenuItem;
    
    public class CakeHouseMenu {
    	private ArrayList<MenuItem> menuItems;
    	
    	
    	public CakeHouseMenu() {
    		menuItems = new ArrayList<MenuItem>();
    		
    		addItem("KFC Cake Breakfast","boiled eggs&toast&cabbage",true,3.99f);
    		addItem("MDL Cake Breakfast","fried eggs&toast",false,3.59f);
    		addItem("Stawberry Cake","fresh stawberry",true,3.29f);
    		addItem("Regular Cake Breakfast","toast&sausage",true,2.59f);
    	}
    
    	private void addItem(String name, String description, boolean vegetable,
    			float price) {
    		MenuItem menuItem = new MenuItem(name, description, vegetable, price);
    		menuItems.add(menuItem);
    	}
    	
    
    	
    	public Iterator getIterator()
    	{
    		return new CakeHouseIterator() ;
    	}
    	
    	class CakeHouseIterator implements  Iterator
    	 {		
    		private int position=0;
    		public CakeHouseIterator()
    		{
    			  position=0;
    		}
    		
    		 	@Override
    			public boolean hasNext() {
    			// TODO Auto-generated method stub
    			if(position<menuItems.size())
    			{
    				return true;
    			}
    			
    			return false;
    		}
    
    		@Override
    		public Object next() {
    			// TODO Auto-generated method stub
    			MenuItem menuItem =menuItems.get(position);
    			position++;
    			return menuItem;
    		}};
    	//其他功能代码
    	
    }
    

    新的女招待

    package com.java.jikexueyuan.iteratormode.iterator;
    
    import java.util.ArrayList;
    
    import com.java.jikexueyuan.iteratormode.MenuItem;
    
    public class Waitress {
    	private ArrayList<Iterator> iterators=new ArrayList<Iterator>();
    
    
    	public Waitress() {
    		
    	}
    	public void addIterator(Iterator iterator)
    	{
    		iterators.add(iterator);
    		
    	}
    	public void printMenu() {
    		Iterator iterator;
    		MenuItem menuItem;
    		for (int i = 0, len = iterators.size(); i < len; i++) {
    			iterator = iterators.get(i);
    			
    			while(iterator.hasNext())
    			{
    				menuItem=(MenuItem)	iterator.next();
    				System.out.println(menuItem.getName() + "***"
    						+menuItem.getPrice()+"***"+ menuItem.getDescription());
    
    			}
    			
    			
    		}
    		
    		
    
    	}
    
    	public void printBreakfastMenu() {
    
    	}
    
    	public void printLunchMenu() {
    
    	}
    
    	public void printVegetableMenu() {
    
    	}
    }
    

    测试类

    package com.java.jikexueyuan.iteratormode.iterator;
    
    
    public class MainTest {
    	public static void main(String[] args) {
    		Waitress mWaitress=new Waitress();
    		CakeHouseMenu mCakeHouseMenu = new CakeHouseMenu();
    		DinerMenu	mDinerMenu = new DinerMenu();
    		
    		mWaitress.addIterator(mCakeHouseMenu.getIterator());
    		mWaitress.addIterator(mDinerMenu.getIterator());
    		mWaitress.printMenu();
    	}
    }
    
    
  • 相关阅读:
    VOA 2009/11/02 DEVELOPMENT REPORT In Kenya, a Better Life Through Mobile Money
    2009.11.26教育报道在美留学生数量创历史新高
    Java中如何实现Tree的数据结构算法
    The Python Tutorial
    VOA HEALTH REPORT Debate Over New Guidelines for Breast Cancer Screening
    VOA ECONOMICS REPORT Nearly Half of US Jobs Now Held by Women
    VOA ECONOMICS REPORT Junior Achievement Marks 90 Years of Business Education
    VOA 2009/11/07 IN THE NEWS A Second Term for Karzai; US Jobless Rate at 10.2%
    Ant入门
    Python 与系统管理
  • 原文地址:https://www.cnblogs.com/kristse/p/Iterator.html
Copyright © 2020-2023  润新知