迭代器模式

提供一种方法顺序访问一个聚合对象中各个元素而又不需暴露该对象的内部表示。[GOF 《设计模式》]

在面向对象的软件设计中,我们经常会遇到一类集合对象,这类集合对象的内部结构可能有着各种各样的实现,

但是归结起来,无非有两点是需要我们去关心的:一是集合内部的数据存储结构,二是遍历集合内部的数据。

面向对象设计原则中有一条是类的单一职责原则,所以我们要尽可能的去分解这些职责,用不同的类去承担不同的职责。

Iterator模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明的访问集合内部的数据。

代码1:迭代器

public interface IIterator
{
    bool MoveNext();

    Object CurrentItem();

    void First();

    void Next();
}

public class ConcreteIterator : IIterator

{
    private ConcreteList list;

    private int index;

    public ConcreteIterator(ConcreteList list)

    {
        this.list = list;

        index = 0;
    }

    public bool MoveNext()

    {
        if (index < list.Length)

            return true;

        else

            return false;
    }

    public Object CurrentItem()

    {
        return list.GetElement(index) ;
    }

    public void First()

    {
        index = 0;
    }

    public void Next()

    {
        if (index < list.Length)

        {
            index++;
        }
    }
}

代码2:聚合类

public interface IList
{
    IIterator GetIterator();
}

public class ConcreteList : IList
{
    int[] list;

    public ConcreteList()

    {
        list = new int[] { 1,2,3,4,5};
    }

    public IIterator GetIterator()

    {
        return new ConcreteIterator(this);
    }

    public int Length

    {
        get { return list.Length; }
    }

    public int GetElement(int index)

    {
        return list[index];
    }
}

代码3:客户端代码

class Program

{
    static void Main(string[] args)

    {
        IIterator iterator;

        IList list = new ConcreteList();

        iterator = list.GetIterator();

        while (iterator.MoveNext())

        {
            int i = (int)iterator.CurrentItem();
            Console.WriteLine(i.ToString());

            iterator.Next();
        }

        Console.Read();

    }

}

  

原文地址:https://www.cnblogs.com/wuMing-dj/p/3360919.html