zoukankan      html  css  js  c++  java
  • 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();
    	}
    }
    
    
  • 相关阅读:
    C# .NET 在一个线程中访问另一个线程的控件 方法汇总 (转载)
    SQL Server 2008数据库复制实现数据库同步备份(2) (转载)
    对《30个提高Web程序执行效率的好经验》的理解
    Web开发常用速查手册大全(100+)(转载)
    web.config 文件详解(转载)
    常用Web Service 收藏
    Microsoft training Kits
    SSH+JQuery整合
    DWR框架在SHH中的配置说明
    卡尔曼滤波器 Kalman Filter
  • 原文地址:https://www.cnblogs.com/kristse/p/Iterator.html
Copyright © 2011-2022 走看看