有很多方法可以把對象堆起來成為一個集合
你可以把它們放進數組
堆棧
列表
或者是散列表中
這是你的自由
迭代器模式定義:提供一個方法順序訪問一個聚合對象中的各個元素
而又不暴露它內部的表示
迭代器模式把在元素之間的游走的責任交給迭代器
而不是聚合對象
這不僅讓聚合的接口和實現變得更簡潔
也可以讓聚合更加專注在它所應該專注的事情上面
而不用去理會遍歷的事情
迭代器類圖:
現在引用《Head First》原文來說明迭代器模式的用法
原本兩家餐廳都是有自己的菜單實現方法
對象村餐廳的菜單用數組實現
而煎餅物的則應用List<>來實現
現在合並了
畢然在菜單上實現方法上要有統一性
兩家餐廳都同意這種做法
但是他們又不想改變自己菜單的實現方法
因為在他們各自的餐廳中都有很多地方依賴於自己菜單的實現方法
那麼還能不能進行統一呢?答案是肯定的
他們有一個共同的特點:就是都是針對聚合對象操作
無論是散列表
堆棧
List<>
等等
兩家菜單都要有遍歷自己菜單的功能
這裡都引入了迭代器模式
統一的迭代器接口:

public interface Iterator<T>


{

//判斷是否有下一個

bool hasNext();

//取得下一個菜單項

T next();

}
這裡用了泛型接口
因為返回的具體實例有不同
我們知道list<>和數組在做遍歷操作的時候方法是不同的
要想實現兩家餐廳菜單的統一
為此兩家餐廳在菜單的實現上面可以通過面積接口編程來實現
不要通過具體實現
: 對象村餐廳的迭代器它是針對數組實現

public class DinerMenuIterator<T> : Iterator<BLL
IteratorTest
MenuItem>


{

MenuItem[] items;

int position =
;//當前位置

//判斷是否有下一個

public bool hasNext()


{

if (position >= items
Length || items[position] == null)


{

return false;

}

else


{

return true;

}

}

//取得下一個菜單項

public MenuItem next()


{

MenuItem menuItem = items[position];

position +=
;

return menuItem;

}

public DinerMenuIterator(MenuItem[] items)


{

ems = items;

}

}
:煎餅店的迭代器:它是用List<>實現

public class PancakeHouseMenuIterator<T> : Iterator<BLL
IteratorTest
MenuItem>


{

List<MenuItem > items;

int position =
;//當前位置

//判斷是否有下一個

public bool hasNext()


{

if (position >= items
Count || items[position] == null)


{

return false;

}

else


{

return true;

}

}

//取得下一個菜單項

public MenuItem next()


{

MenuItem menuItem = items[position];

position +=
;

return menuItem;

}

public PancakeHouseMenuIterator(List<MenuItem> items)


{

ems = items;

}

}
:對象村菜單實現

public class DinerMenu


{

MenuItem[] menuItems;

public DinerMenu()


{

//菜單中最多放
個菜單項

menuItems = new MenuItem[
];

addItem(
DinerMenu:eag
);

}


/**//// <summary>

/// 增加菜單項

/// </summary>

/// <param name=
name
></param>

public void addItem(string name)


{

MenuItem _menuItem = new MenuItem(name);

//為了簡化代碼在這就加入一個菜單項

menuItems[
] = _menuItem;


}

public Iterator<MenuItem> createIterator()


{

return new DinerMenuIterator<MenuItem >(menuItems );

}

}
:煎餅店菜單實現

public class PancakeHouseMenu


{

List<MenuItem > _menuItems;

public PancakeHouseMenu()


{

addItem(
PancakeHouseMenu:eag
);

}


/**//// <summary>

/// 增加菜單項

/// </summary>

/// <param name=
name
></param>

public void addItem(string name)


{

MenuItem _menuItem = new MenuItem(name);

_menuItems = new List<MenuItem>();

_menuItems
Add(_menuItem);

}

public Iterator<MenuItem> createIterator()


{

return new PancakeHouseMenuIterator<MenuItem>(_menuItems);


}

}
菜單項具體內容:為了簡化代碼
在這就寫了菜單項的名稱
其它的省略了

public class MenuItem


{

//菜單具體內容名稱

string _name;

public MenuItem(string name)


{

this
_name = name;

}


/**//// <summary>

/// 菜單項名稱

/// </summary>

public string name


{


get

{ return this
_name; }


set

{ this
_name = value; }

}

}
服務員調用代碼有了菜單還得要有服務的服務
服務員的責任就是打印出來兩家餐廳的所在菜單項供客人點餐

public class Waitress


{

PancakeHouseMenu _PancakeHouseMenu;

DinerMenu _DinerMenu;

public Waitress(PancakeHouseMenu pancakeHouseMenu
DinerMenu dinerMenu)


{

this
_PancakeHouseMenu = pancakeHouseMenu;

this
_DinerMenu = dinerMenu;

}


/**//// <summary>

/// 返回菜單項的內容

/// </summary>

/// <param name=
iterator
></param>

/// <returns></returns>

public string printMenu(Iterator<MenuItem> iterator)


{

string sContent =
;

while (iterator
hasNext())


{

MenuItem menuItem = (MenuItem)iterator
next();

sContent += menuItem
name+
\n
;

}

return sContent;

}

public string printMenu()


{

//對象村餐廳菜單內容

Iterator<MenuItem > dinerMenuIterator = _DinerMenu
createIterator();

//對象村煎餅店餐廳菜單內容

Iterator<MenuItem> pancakeHouseMenuIterator = _PancakeHouseMenu
createIterator();

string s =
;

s +=
對象村餐廳菜單內容:
+printMenu(dinerMenuIterator)+
\n
;

s +=
對象村煎餅店餐廳菜單內容:
+ printMenu(pancakeHouseMenuIterator );

return s;

}

}
client調用簡單的打印出了兩家餐廳的所有菜單項的名稱

PancakeHouseMenu pancakeHouseMenu = new PancakeHouseMenu();

DinerMenu dinerMenu = new DinerMenu();

Waitress waitress = new Waitress(pancakeHouseMenu
dinerMenu);

string s = waitress
printMenu();

this
Label
Text = s;
總結迭代器模式針對多種聚合對象操作的實現特別有幫助
可以將多種不同的聚合對象統一起來
From:http://tw.wingwit.com/Article/program/net/201311/13305.html