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();
}
}
参考: