1. 程式人生 > >常用軟體設計模式(六)迭代器模式

常用軟體設計模式(六)迭代器模式

迭代器模式不常用,很多高階語言都將該模式封裝在語言中了,入C#的 foreach in 但是有必要了解一下

迭代器模式:提供一個方法順序訪問一個聚合物件中各個元素,而又不暴露該物件的內部表示。

優點: 1、它支援以不同的方式遍歷一個聚合物件。

             2、迭代器簡化了聚合類。

             3、在同一個聚合上可以有多個遍歷。

             4、在迭代器模式中,增加新的聚合類和迭代器類都很方便,無須修改原有程式碼。

缺點:由於迭代器模式將儲存資料和遍歷資料的職責分離,增加新的聚合類需要對應增加新的迭代器類,類的個數成對增加,這在一定程度上增加了系統的複雜性。

//Iterator迭代器抽象類
abstract class Iterator
{
    public abstract object First();
    public abstract object Next();
    public abstract bool IsDone();
    public abstract object CurrentItem();
}

//ConcreteIterator具體迭代器類,繼承Iterator
Class ConcreteIterator:Iterator
{
    private ConcreteAggregate aggregate;
    private int current = 0;

    public ConcreteIterator(ConcreteAggregate aggregate)
    {
        this.aggregate = aggregate;
    }

    public ovarride object First()
    {
        return aggregate[0];
    }

    public override object Next()
    {
        object ret = null;
        current ++;
        if()
        {
            ret = aggregate[current];
        }
        return ret;
    }

    public override bool IsDone()
    {
        return current >= aggregate.Count ? true : false;
    }

    public override object CurrentItem()
    {
        return aggregate[current];
    }
}

class ConcreteAggregate:Aggregate
{
    private IList<object> item = new List<object>();
    public override Iterator CreateIterator()
    {
        return new ConcreteIterator(this);
    }

    public int Count
    {
        get{return item.Count;}
    }

    public object this[int index]
    {
        get{return item[index];}
        set{item.Insert(index,value);}
    }
}

//客戶端程式碼
static void Main(string[] args)
{
    ConcreteAggregate a = new ConcreteAggregate();
    a[0] = "A1";
    a[1] = "A2";
    a[2] = "A3";
    a[3] = "A4";

    Iterator i = new ConcreteIterator(a);
    object item = i.First();
    while(!i.IsDone())
    {
        Console.WriteLine("{0}",i.CurrentItem());
        i.Next();
    }
    Console.Read();
}