您的位置:首页 > 其它

[Head First设计模式]生活中学设计模式——迭代器模式

2014-03-30 12:39 375 查看

系列文章

[Head First设计模式]山西面馆中的设计模式——装饰者模式

[Head First设计模式]山西面馆中的设计模式——观察者模式

[Head First设计模式]山西面馆中的设计模式——建造者模式

[Head First设计模式]饺子馆(冬至)中的设计模式——工厂模式

[Head First设计模式]一个人的平安夜——单例模式

[Head First设计模式]抢票中的设计模式——代理模式

[Head First设计模式]面向对象的3特征5原则

[Head First设计模式]鸭子模型——策略模式

[Head First设计模式]云南米线馆中的设计模式——模版方法模式

[Head First设计模式]餐馆中的设计模式——命令模式

[Head First设计模式]身边的设计模式——适配器模式

迭代器模式

提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。

类图



角色

Iterator:定义访问和遍历元素的接口

Concretelterator:具体迭代器,实现迭代器接口,对该聚合遍历时跟踪当前位置。

Aggregate:聚合,定义创建相应迭代器对象的接口。

ConcreteAggregate:具体聚合,其工作是实现相应迭代器的接口,返回具体迭代器的一个适当的实例。

适用场景

1,访问一个聚合对象的内容而无需暴露它的内部表示

2,支持对聚合对象的多种遍历

3,为遍历不同的聚合结构提供一个统一的接口(即支持多态迭代)

优缺点

优点:

1,支持以不同的方式遍历一个聚合

2,简化了聚合的接口

3,可同时进行多个遍历

缺点:

和集合密切相关,限制了其广泛使用。

一个例子

公共汽车售票员工作的场景:

售票员不管上来的是人还是行李,不管是中国人还是外国人,不管是内部员工还是别的,只要是来乘车的乘客,就必须要买票。也就是说,当我们需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,就应该考虑用迭代模式。

另外,售票员从车头到车尾来售票,也可以从车尾向车头来售票,也就是说,当我们需要对聚集有很多种方式遍历时,可以考虑用迭代器模式。

由于不管乘客是什么,售票员的做法始终是相同的,都是从第一个开始,下一个,是否结束,当前售到那一个人,这些方法每天他都在做,也就是说,当遍历不同的聚集结构提供如开始、下一个、是否结束、当前哪一项等统一的过程,可以考虑使用迭代器模式。

这里使用IEnumerator,.net中的迭代器接口

namespace System.Collections
{
// 摘要:
//     支持对非泛型集合的简单迭代。
[ComVisible(true)]
[Guid("496B0ABF-CDEE-11d3-88E8-00902754C43A")]
public interface IEnumerator
{
// 摘要:
//     获取集合中的当前元素。
//
// 返回结果:
//     集合中的当前元素。
object Current { get; }

// 摘要:
//     将枚举数推进到集合的下一个元素。
//
// 返回结果:
//     如果枚举数成功地推进到下一个元素,则为 true;如果枚举数越过集合的结尾,则为 false。
//
// 异常:
//   System.InvalidOperationException:
//     在创建了枚举数后集合被修改了。
bool MoveNext();
//
// 摘要:
//     将枚举数设置为其初始位置,该位置位于集合中第一个元素之前。
//
// 异常:
//   System.InvalidOperationException:
//     在创建了枚举数后集合被修改了。
void Reset();
}
}


Concretelterator:具体迭代器,实现迭代器接口,对该聚合遍历时跟踪当前位置。

namespace Wolfy.迭代器模式
{
public class Concretelterator : IEnumerator
{
private ConcreteAggregate aggregate;
private  int currentIndex=-1;
public Concretelterator(ConcreteAggregate aggregate)
{
this.aggregate = aggregate;
}
public object Current
{
get { return aggregate[currentIndex]; }
}

public bool MoveNext()
{
currentIndex++;
return currentIndex < this.aggregate.Count;

}

public void Reset()
{
currentIndex = -1;
}
}
}


namespace Wolfy.迭代器模式
{
public abstract class Aggregate
{
public abstract IEnumerator CreateEnumerator();
}
}


ConcreteAggregate:具体聚合,其工作是实现相应迭代器的接口,返回具体迭代器的一个适当的实例。

namespace Wolfy.迭代器模式
{
public class ConcreteAggregate : Aggregate
{
private  ArrayList arr=new ArrayList();
public int Count
{
get { return arr.Count; }
}
public object this[int index]
{
get { return arr[index]; }
set { arr.Insert(index, value); }
}
public override System.Collections.IEnumerator CreateEnumerator()
{
return new Concretelterator(this);
}
}
}


测试

namespace Wolfy.迭代器模式
{
class Program
{
static void Main(string[] args)
{

ConcreteAggregate agg = new ConcreteAggregate();
agg[0] = "乘客1";
agg[1] = "乘客2";
agg[2] = "乘客3";
agg[3] = "乘客4";
agg[4] = "乘客5";
agg[5] = "乘客6";
agg[6] = "乘客7";
agg[7] = "乘客8";
agg[8] = "乘客9";
agg[9] = "乘客10";
IEnumerator iterator =agg.CreateEnumerator();
while (iterator.MoveNext())
{
Console.WriteLine(iterator.Current);
}
iterator.Reset();
Console.Read();
}
}
}


结果:



总结

这个模式给你提供了一种方法,可以顺序访问一个聚集对象中的元素,而又不用知道内部是如何表示的。

参考书:

《Head First 设计模式》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: