常用软件设计模式(六)迭代器模式

迭代器模式不常用,很多高级语言都将该模式封装在语言中了,入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();
}

猜你喜欢

转载自blog.csdn.net/Chenrongsake/article/details/83176484