定义
迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。
适用性
访问一个聚合对象的内容而无需暴露它的内部表示
支持对聚合对象的多种遍历
为遍历不同的聚合结构提供一个统一的接口
类图
示例
比如说餐厅中有一份中餐菜单是用vector存储,一份西餐菜单是用数组存储,现在要求我们为餐厅服务员提供一个统一的接口来访问这两个菜单的内容,这时候就可以用
到迭代器模式了
代码
中餐菜单:
package com.org.Iterator;
import java.util.Vector;
public class ChineseFoodMenu
{
public Vector<String> vtrMeun;
public ChineseFoodMenu()
{
if (vtrMeun == null)
{
vtrMeun = new Vector<String>();
vtrMeun.add("鱼香肉丝");
vtrMeun.add("红烧茄子");
vtrMeun.add("水煮肉片");
}
}
public Iterator CreateIterator()
{
return new ChineseFoodMenuIterator(vtrMeun);
}
}
西餐菜单:
package com.org.Iterator;
public class WestFoodMenu
{
public String[] vtrMenu;
public WestFoodMenu()
{
vtrMenu = new String[3];
vtrMenu[0] = "牛排";
vtrMenu[1] = "通心粉";
vtrMenu[2] = "披萨";
}
public Iterator CreateIterator()
{
return new WestFoodMenuIterator(vtrMenu);
}
}
Iterator接口
package com.org.Iterator;
public interface Iterator
{
public Object Next();
public Object First();
public Object Last();
public Object Current();
public boolean HasNext();
}
中餐菜单迭代器:
package com.org.Iterator;
import java.util.Vector;
public class ChineseFoodMenuIterator implements Iterator
{
private Vector<String> m_vtrMenu;
private int nIndex;
public ChineseFoodMenuIterator(Vector<String> vtrMenu)
{
nIndex = 0;
m_vtrMenu = vtrMenu;
}
@Override
public Object Next()
{
if(HasNext())
{
Object obj = m_vtrMenu.get(nIndex);
nIndex++;
return obj;
}
return null;
}
@Override
public Object First()
{
return m_vtrMenu.firstElement();
}
@Override
public Object Last()
{
return m_vtrMenu.lastElement();
}
@Override
public boolean HasNext()
{
if(nIndex < m_vtrMenu.size())
{
return true;
}
return false;
}
@Override
public Object Current()
{
if(HasNext())
{
return m_vtrMenu.get(nIndex);
}
return null;
}
}
西餐菜单迭代器:
package com.org.Iterator;
public class WestFoodMenuIterator implements Iterator
{
private String[] m_vtrMenu;
private int nIndex;
public WestFoodMenuIterator(String[] vtrMenu)
{
nIndex = 0;
m_vtrMenu = vtrMenu;
}
@Override
public Object Next()
{
if (HasNext())
{
Object obj = m_vtrMenu[nIndex];
nIndex++;
return obj;
}
return null;
}
@Override
public Object First()
{
return m_vtrMenu[0];
}
@Override
public Object Last()
{
return m_vtrMenu[m_vtrMenu.length - 1];
}
@Override
public boolean HasNext()
{
if (nIndex < m_vtrMenu.length)
{
return true;
}
return false;
}
@Override
public Object Current()
{
if (HasNext())
{
return m_vtrMenu[nIndex];
}
return null;
}
}
服务员使用时:
package com.org.Iterator;
public class Waiter
{
public static void main(String[] args)
{
Iterator iter = new ChineseFoodMenu().CreateIterator();
printMenu(iter);
Iterator iter1 = new WestFoodMenu().CreateIterator();
printMenu(iter1);
}
public static void printMenu(Iterator iter)
{
while(iter.HasNext())
{
System.out.println(iter.Next().toString());
}
}
}