Net设计模式实例之迭代器模式(Iterator Pattern)

一、迭代器模式简介(Brief Introduction

迭代器模式(Iterator Pattern),提供一种方法顺序访问一个聚合对象中元素,而不暴露改集合对象的内部表示。
Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.

二、解决的问题(What To Solve

当需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,应该考虑用迭代器模式;当需要对聚集有多种方式遍历时,可以考虑使用迭代器模式。

三、迭代器模式分析(Analysis

1、迭代器模式结构

Net设计模式实例之迭代器模式(Iterator Pattern)
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 ArrayList _items = new ArrayList();
    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 = null;
        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 Main(string[] args)
{
    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 collection:");
    object item = i.First();
    while (item != null)
    {
        Console.WriteLine(item);
        item = i.Next();
    }
    // Wait for user
    Console.ReadKey();
}

3、程序运行结果










本文转自 灵动生活 51CTO博客,原文链接:http://blog.51cto.com/smartlife/275320,如需转载请自行联系原作者