概念:
迭代器模式提供了一种方法顺序访问一个聚合对象中的各个元素,而又无需暴露该对象的内部实现,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。
意图:
提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。
主要解决:
不同的方式来遍历整个整合对象。
优点:
- 它支持以不同的方式遍历一个聚合对象。
- 迭代器简化了聚合类。
- 在同一个聚合上可以有多个遍历。
- 在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。
缺点:
-
增加了类的个数,这在一定程度上增加了系统的复杂性。
-
在日常开发中,我们几乎不会自己写迭代器。除非需要定制一个自己实现的数据结构对应的迭代器,开源框架提供的 API 完全够用。
迭代器模式的结构
抽象容器角色(Aggregate): 负责提供创建具体迭代器角色的接口,一般是一个接口,提供一个iterator()方法。
public interface 抽象容器
{ //添加方法
public void add(object obj);
//移除方法
public void remove(object obj);
//得到迭代器
public Iterator GetIterator();
}
具体容器角色(ConcreteAggregate): 就是实现抽象容器的具体实现类。
using System.Collections.Generic;
public class 具体容器 : 抽象容器
{
private List<object> mList = new List<object>();
public void add(object obj)
{
mList.Add(obj);
}
public Iterator GetIterator()
{
return (new 具体迭代器(mList));
}
public void remove(object obj)
{
mList.Remove(obj);
}
}
抽象迭代器角色(Iterator): 负责定义访问和遍历元素的接口。
public interface Iterator
{ //迭代器第一个元素
object first();
//迭代器下一个元素
object next();
//下一个元素是否不为空
bool hasNext();
}
具体迭代器角色(ConcreteIterator): 实现迭代器接口,并要记录遍历中的当前位置。
using System.Collections.Generic;
public class 具体迭代器 : Iterator
{
private List<object> mList = null;
private int index = -1;
public 具体迭代器(List<object> list)
{
mList = list;
}
public object first()
{
index = 0;
return mList[index];
}
public bool hasNext()
{
if (index < mList.Count - 1)
{
return true;
}
else
{
return false;
}
}
public object next()
{
if (hasNext())
{
index += 1;
return mList[index];
}
return null;
}
}
测试
using System;
class Program
{
static void Main(string[] args)
{
抽象容器 m = new 具体容器();
m.add("a1");
m.add("a2");
m.add("a3");
Console.WriteLine("输出类表:");
//取得迭代器
Iterator iterator = m.GetIterator();
while (iterator.hasNext())
{
Console.WriteLine(iterator.next());
}
Console.WriteLine("first:"+iterator.first());
Console.Read();
}
}
输出示例
设计模式------首页