一、迭代器模式简介(Brief Intro
du
ction)
迭代器模式(
Iterator Pattern
),提供一种方法顺序访问一个聚合对象中元素,而不暴露改集合对象的内部表示。
Provide a way to access the elements of an aggregate object sequentia
ll
y without exposing its underlying representation.
二、解决的问题(What To Solve)
当需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,应该考虑用迭代器模式;当需要对聚集有多种方式遍历时,可以考虑使用迭代器模式。
三、迭代器模式分析(Analysis)
1、迭代器模式结构
Aggragate
类
:聚集抽象类
并通过
CreateIterator()
方法创建一个迭代对象。
ConcrateAggregate
类
:具体实现类,继承于
Aggregate
抽象类,实现创建迭代对象的方法。
Iterator
迭代抽象类
:定义一个接口用于访问和遍历集合中的各个元素;
First()
方法:定位第一个元素
Next()
方法:定位下一个元素
IsDone()
方法:是否为结尾元素
CurrentItem()
方法:定位当前对象
ConcreteIterator
具体迭代类
:继承于
Iterator
抽象类,实现父类中的各个方法。
2、源代码
1
、
聚集抽象类
Aggregate
及其
具体实现类
ConcreteAggregate
|
///
<summary>
///
The 'Aggregate' abstract class
///
</summary>
abstract
class Aggregate
{
public abstract Iterator
CreateIterator();
}
///
<summary>
///
The 'ConcreteAggregate' class
///
</summary>
class
ConcreteAggregate
: Aggregate
{
private Ar
public override Iterator
CreateIterator()
{
return new ConcreteIterator
(this
);
}
// Gets item count
public int
Count
{
get
{ return
_items.Count; }
}
// Indexer
public object this
[int
index]
{
get
{ return
_items[index]; }
set
{ _items.Insert(index, value
); }
}
}
|
2
、抽象迭代器类
Iterator
及其具体迭代器类ConcreteIterator
|
///
<summary>
///
The 'Iterator' abstract class
///
</summary>
abstract
class Iterator
{
public abstract object
First();
public abstract object
Next();
public abstract bool
IsDone();
public abstract object
CurrentItem();
}
///
<summary>
///
The 'ConcreteIterator' class
///
</summary>
class
ConcreteIterator
: Iterator
{
private ConcreteAggregate
_aggregate;
private int
_current = 0;
// Constructor
public
ConcreteIterator(ConcreteAggregate
aggregate)
{
this
._aggregate = aggregate;
}
// Gets first iteration item
public override object
First()
{
return
_aggregate[0];
}
// Gets next iteration item
public override object
Next()
{
object
ret = nu
if
(_current < _aggregate.Count - 1)
{
ret = _aggregate[++_current];
}
return
ret;
}
// Gets current iteration item
public override object
CurrentItem()
{
return
_aggregate[_current];
}
// Gets whether iterations are complete
public override bool
IsDone()
{
return
_current >= _aggregate.Count;
}
}
|
3
、客户端代码
|
static
void
{
ConcreteAggregate
a = new ConcreteAggregate
();
a[0] = "Item A"
;
a[1] = "Item B"
;
a[2] = "Item C"
;
a[3] = "Item D"
;
// Create Iterator and provide aggregate
ConcreteIterator
i = new ConcreteIterator
(a);
Console
.WriteLine("Iterating over co
object
item = i.First();
while
(item != nu
{
Console
.WriteLine(item);
item = i.Next();
}
// Wait for user
Console
.ReadKey();
}
|
3、程序运行结果
本文转自 灵动生活 51CTO博客,原文链接:http://blog.51cto.com/smartlife/275320,如需转载请自行联系原作者