1,动机。
在软件构建过程中,集合对象内部结构常常变化各异。但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码透明地访问其中包含的元素;同时这种“透明遍历”也为“ 同一种算法在多种集合对象上进行操作”提供了可能。
2,实用性
1.访问一个聚合对象的内容而无需暴露它的内部表示。
2.支持对聚合对象的多种遍历。
3 .为遍历不同的聚合结构提供一个统一的接口(即, 支持多态迭代)。3,生活中的例子:
迭代器提供一种方法顺序访问一个集合对象中各个元素,而又不需要暴露该对象的内部表示。在早期的电视机中,一个拨盘用来改变频道。当改变频道时,需要手工转动拨盘移过每一个频道,而不论这个频道是否有信号。现在的电视机,使用[后一个]和[前一个]按钮。当按下[后一个]按钮时,将切换到下一个预置的频道。想象一下在陌生的城市中的旅店中看电视。当改变频道时,重要的不是几频道,而是节目内容。如果对一个频道的节目不感兴趣,那么可以换下一个频道,而不需要知道它是几频道。
4,代码实现
using System;
using UnityEngine;
/// <summary>
/// 抽象聚集
/// </summary>
public interface IList
{
Iterator GetIterator();
}
/// <summary>
/// 抽象迭代器
/// </summary>
public interface Iterator
{
bool MoveNext();
object CurrentItem();
void First();
void Next();
}
public class ConcreateList : IList{
int [] list;
public ConcreateList()
{
list = new int[] { 1,2,3,4,5};
}
public Iterator GetIterator()
{
return new ConcreateIterator (this);
}
public int Length
{
get{ return list.Length; }
}
public int GetElement(int index)
{
return list[index];
}
}
public class ConcreateIterator : Iterator
{
private ConcreateList list;
private int index;
public ConcreateIterator(ConcreateList list)
{
this.list = list;
index = 0;
}
public bool MoveNext()
{
if (index < list.Length) {
return true;
} else {
return false;
}
}
public object CurrentItem()
{
return list.GetElement (index);
}
public void First()
{
index = 0;
}
public void Next()
{
if (index < list.Length) {
index++;
}
}
}
class ProgramMain
{
static void ProMain(string[] args)
{
Iterator iterator;
IList list = new ConcreateList ();
iterator = list.GetIterator ();
while(iterator.MoveNext())
{
int i = (int)iterator.CurrentItem ();
Debug.Log ("item id :"+i.ToString());
iterator.Next ();
}
}
}