C# 设计模式-迭代器(Iterator)

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


主要组成:

Aggregate-聚合父类或接口

ConcreteAggregate-具体聚合对象

Iterator-迭代器父类或接口

ConcreteIterator-具体迭代器


相关类:

using System;
using System.Collections.Generic;

namespace Iterator
{
    /// <summary>
    /// 聚合父类或接口
    /// </summary>
    abstract class AggregateClass
    {
        public abstract Iterator CreateIterator();
    }

    /// <summary>
    /// 列表聚合
    /// </summary>
    class ListAggregate : AggregateClass
    {
        List<object> list = new List<object>();

        public override Iterator CreateIterator()
        {
            return new ListIterator(this);
        }

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

        public void Add(object item)
        {
            list.Add(item);
        }

        public object GetItemAt(int index)
        {
            return list[index];
        }
    }
    /// <summary>
    /// 迭代器父类或接口
    /// </summary>
    abstract class Iterator
    {
        public abstract void First();
        public abstract void Next();
        public abstract bool IsDone();
        public abstract object CurrentItem();
    }
    /// <summary>
    /// 列表迭代器
    /// </summary>
    class ListIterator : Iterator
    {
        ListAggregate listAggregate;
        int cuurentIndex;

        public ListIterator(ListAggregate listAggregate)
        {
            this.listAggregate = listAggregate;
        }
        //将迭代器置于第一个元素
        public override void First()
        {
            cuurentIndex = 0;
        }
        //下一个元素
        public override void Next()
        {
            cuurentIndex++;
        }
        //是否超出列表
        public override bool IsDone()
        {
            return cuurentIndex >= listAggregate.Count;
        }
        //返回当前元素
        public override object CurrentItem()
        {
            if (IsDone())
            {
                throw new IndexOutOfRangeException();
            }
            return listAggregate.GetItemAt(cuurentIndex);
        }
    }
}

调用:

using System;

namespace Iterator
{
    class Program
    {
        static void Main(string[] args)
        {
            //列表聚合
            ListAggregate listAggregate = new ListAggregate();
            listAggregate.Add("迭");
            listAggregate.Add("代");
            listAggregate.Add("器");
            //创建迭代器
            Iterator listIterator = listAggregate.CreateIterator();
            for (listIterator.First(); !listIterator.IsDone(); listIterator.Next())
            {
                Console.WriteLine(listIterator.CurrentItem());
            }
            Console.Read();
        }
    }
}

结果:


参考资料:《设计模式-可复用面对对象软件的基础》


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值