Iterator(迭代器) | 負責定義訪問和遍歷元素的接口 |
ConcreteIteraror(具體迭代器) | 實現迭代器接口,並需要記錄遍歷中的當前位置 |
Aggregate(聚合角色) | 定義獲得迭代器角色的接口 |
ConcreteAggregate(具體聚合角色) | 具體聚合角色實現聚合角色接口 |
定義:迭代器模式提供了一種方法順序訪問一個聚合對象(理解爲集合對象)中各個元素,而又無需暴露該對象的內部表示,這樣既可以做到不暴露集合的內部結構,又可讓外部代碼透明地訪問集合內部的數據。
白箱聚集與外稟迭代器:具體迭代器持有具體集合類的引用。通過抽象迭代器方法,繼而調用到具體迭代器的方法,實現對具體集合類的迭代訪問。
//定義一個抽象聚合類
public abstract class Aggergate
{
//創建一個迭代器
public virtual Iterator CreateIterator()
{
return null;
}
}
//定義一個具體聚合類
public class ConcreteAggregate:Aggergate
{
private object[] m_objsAry = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };
public int Size()
{
return m_objsAry.Length;
}
public object GetElement(int _index)
{
if(_index < 0 || _index > m_objsAry.Length)
{
return null;
}
return m_objsAry[_index];
}
public override Iterator CreateIterator()
{
return new ConcreteIterator(this);
}
}
//定義一個迭代接口
public interface Iterator
{
void First();
void Next();
bool IsDone();
object CurrentItem();
}
//具體迭代器類
public class ConcreteIterator:Iterator
{
public ConcreteAggregate m_aggretate;
private int m_index = 0;
private int m_size = 0;
public ConcreteIterator(ConcreteAggregate _aggregate)
{
m_aggretate = _aggregate;
m_size = m_aggretate.Size();
m_index = 0;
}
public void First()
{
m_index = 0;
}
public void Next()
{
if(m_index < m_size)
{
m_index++;
}
}
public bool IsDone()
{
return m_index >= m_size;
}
public object CurrentItem()
{
return m_aggretate.GetElement(m_index);
}
}
void Start()
{
Iterator tempIterator;
Aggergate tempAggregate = new ConcreteAggregate();
tempIterator = tempAggregate.CreateIterator();
while(!tempIterator.IsDone())
{
Debug.Log(tempIterator.CurrentItem());
tempIterator.Next();
}
}
黑箱聚集與內稟迭代器:黑箱聚集不向外界提供遍歷自己內部元素的接口,因此聚集的成員只能被聚集內部的方法訪問。由於內稟迭代器恰好也是聚集的成員,因此可以訪問聚集元素。
//定義一個抽象聚合類
public abstract class Aggergate
{
//創建一個迭代器
public virtual Iterator CreateIterator()
{
return null;
}
}
//定義一個具體聚合類
public class ConcreteAggregate:Aggergate
{
public static object[] m_objsAry = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };
private class ConcreteIterator:Iterator
{
private int m_index = 0;
private int m_size = 0;
public void First()
{
m_index = 0;
}
public void Next()
{
if(m_index < m_objsAry.Length)
{
m_index++;
}
}
public bool IsDone()
{
return m_index == m_objsAry.Length;
}
public object CurrentItem()
{
return m_objsAry[m_index];
}
}
public int Size()
{
return m_objsAry.Length;
}
public object GetElement(int _index)
{
if(_index < 0 || _index > m_objsAry.Length)
{
return null;
}
return m_objsAry[_index];
}
public override Iterator CreateIterator()
{
return new ConcreteIterator();
}
}
//定義一個迭代接口
public interface Iterator
{
void First();
void Next();
bool IsDone();
object CurrentItem();
}
void Start()
{
Iterator tempIterator;
Aggergate tempAggregate = new ConcreteAggregate();
tempIterator = tempAggregate.CreateIterator();
while(!tempIterator.IsDone())
{
Debug.Log(tempIterator.CurrentItem());
tempIterator.Next();
}
}
參考: