1、迭代器设计模式定义
提供一种方法顺序访问聚合对象中的各个元素,而又不暴漏其内部表示。
2、要点
迭代器模式提供了一种方法,可以顺序访问一个聚合对象中的元素,而不不用知道内部是如何表示的。
迭代器模式把在元素之间游走的责任交给了迭代器,而不是聚合对象,使得聚合对象的接口实现更加简洁,可以让聚合更专注在其他事情上面。
3、例子代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace IteratorPattern
{
/// <summary>
/// 遍历接口
/// </summary>
public interface Iterator
{
bool hasNext();
object Next();
}
/// <summary>
/// 午餐菜单遍历迭代器实现
/// </summary>
public class DinnerMenuIterator : Iterator
{
private List<MenuItem> m_MenuList;
private int index = 0;
public DinnerMenuIterator(List<MenuItem> menuList)
{
m_MenuList = menuList;
}
#region Iterator 成员
public bool hasNext()
{
return m_MenuList.Count > index && m_MenuList[index]!=null;
}
public object Next()
{
MenuItem pItem = m_MenuList[index];
index++;
return pItem;
}
#endregion
}
/// <summary>
/// 早餐菜单迭代器实现
/// </summary>
public class PanCakeHouseIterator : Iterator
{
private MenuItem[] m_MenuList;
private int index = 0;
public PanCakeHouseIterator(MenuItem[] menuList)
{
m_MenuList = menuList;
}
#region Iterator 成员
public bool hasNext()
{
return m_MenuList.Length > index && m_MenuList[index] != null;
}
public object Next()
{
MenuItem pItem = m_MenuList[index];
index++;
return pItem;
}
#endregion
}
/// <summary>
/// 菜单项
/// </summary>
public class MenuItem
{
private string m_name;
private string m_description;
private bool m_vegetarian;
private double m_price;
public MenuItem(string name, string description, bool vegetarian, double price)
{
m_name = name;
m_description = description;
m_vegetarian = vegetarian;
m_price = price;
}
public override string ToString()
{
return string.Format("name = {0};description = {1};vegetarian ={2};price = {3}", m_name, m_description, m_vegetarian, m_price);
}
}
/// <summary>
/// 早餐菜单
/// </summary>
public class PanCakeHouseMenu
{
private const int MAX_ITEMS = 100;
private MenuItem[] m_Items;
private int count = 0;
public PanCakeHouseMenu()
{
m_Items = new MenuItem[MAX_ITEMS];
AddItem("煎饼", "大煎饼", true, 10);
AddItem("煎饼", "小煎饼", true, 8);
AddItem("煎饼", "大煎饼", false, 7);
AddItem("煎饼","大煎饼",false,5);
}
/// <summary>
/// 添加菜单项
/// </summary>
/// <param name="name"></param>
/// <param name="description"></param>
/// <param name="vegetarian"></param>
/// <param name="price"></param>
private void AddItem(string name, string description, bool vegetarian, double price)
{
if(count >= MAX_ITEMS)
return;
MenuItem pItem = new MenuItem(name, description, vegetarian, price);
m_Items[count] = pItem;
count++;
}
public Iterator CreateIterator()
{
return new PanCakeHouseIterator(m_Items);
}
}
/// <summary>
/// 午餐菜单
/// </summary>
public class DinnerMenu
{
private List<MenuItem> m_Items;
public DinnerMenu()
{
m_Items = new List<MenuItem>();
AddItem("披萨", "超级至尊", true, 10);
AddItem("披萨", "夏威夷风光", true, 8);
AddItem("披萨", "超级大虾", false, 8);
AddItem("披萨", "美食精选", false, 10);
}
/// <summary>
/// 添加菜单项
/// </summary>
/// <param name="name"></param>
/// <param name="description"></param>
/// <param name="vegetarian"></param>
/// <param name="price"></param>
private void AddItem(string name, string description, bool vegetarian, double price)
{
MenuItem pItem = new MenuItem(name, description, vegetarian, price);
m_Items.Add(pItem);
}
public Iterator CreateIterator()
{
return new DinnerMenuIterator(m_Items);
}
}
/// <summary>
/// 外部调用类
/// </summary>
public class Waitress
{
private PanCakeHouseMenu m_PanCakeHouseMenu;
private DinnerMenu m_DinnerMenu;
public Waitress(PanCakeHouseMenu panCakeHouseMenu, DinnerMenu dinnerMenu)
{
m_PanCakeHouseMenu = panCakeHouseMenu;
m_DinnerMenu = dinnerMenu;
}
public void PrintMenu()
{
Print(m_PanCakeHouseMenu.CreateIterator());
Print(m_DinnerMenu.CreateIterator());
}
private void Print(Iterator pIter)
{
MenuItem pItem = null;
while (pIter.hasNext())
{
pItem = pIter.Next() as MenuItem;
Console.WriteLine(pItem.ToString());
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace IteratorPattern
{
class Program
{
static void Main(string[] args)
{
Waitress pWaitress = new Waitress(new PanCakeHouseMenu(), new DinnerMenu());
pWaitress.PrintMenu();
}
}
}
4、主要类图