行为模式之四---Iterator

1、结构图

 

Iterator结构图

2、代码

 

 

/*************************************************************************

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

 * 

 * 适用性:

 * 1、访问一个聚合对象的内容而无需暴露它的内部表示。 

 * 2、支持对聚合对象的多种遍历。 

 * 3、为遍历不同的聚合结构提供一个统一的接口(即, 支持多态迭代)。 

 * 

 * 协作:ConcreteAggregate跟踪聚合中的当前对象,并能够计算出待遍历的后继对象。

 * 

 * 作者:董怀信

 * 日期:2009-06-08

 * **********************************************************************/

 

using System;

using System.Collections.Generic;

 

 

namespace DesignPattern.BehavioralPattern

{

    /// <summary>

    /// 迭代器定义访问和遍历元素的接口。

    /// </summary>

    /// <typeparam name="T">元素的类型</typeparam>

    public interface Iterator<T>

    {

        void First();

        bool Next();

        bool IsDone();

        T CurrentItem();

    }

 

    /// <summary>

    /// 聚合定义创建相应迭代器对象的接口。

    /// </summary>

    /// <typeparam name="T">元素类型</typeparam>

    public interface Aggregate<T>

    {

        Iterator<T> CreateIterator();

 

    }

 

    /// <summary>

    /// 具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例。

    /// </summary>

    /// <typeparam name="T"></typeparam>

    public class ConcreteAggregate<T> : Aggregate<T>

    {

        private List<T> m_itemList;

        public ConcreteAggregate(T[] items)

        {

            m_itemList = new List<T>(items);

        }

 

 

        #region Aggregate<T> Members

 

        public Iterator<T> CreateIterator()

        {

            return new ConcreteIterator<T>(this);

        }

 

        #endregion

        /// <summary>

        /// 内部类:具体迭代器实现迭代器接口。

        /// 对该聚合遍历是跟踪当前位置。

        /// </summary>

        /// <typeparam name="T"></typeparam>

        public class ConcreteIterator<T> : Iterator<T>

        {

            private ConcreteAggregate<T> m_concreteAggregate;

            public ConcreteIterator(ConcreteAggregate<T> aggregate)

            {

                m_concreteAggregate = aggregate;

            }

            private int m_index;

            #region Iterator<T> Members

 

            public void First()

            {

                m_index = -1;

            }

 

            public bool Next()

            {

                if (m_index < m_concreteAggregate.m_itemList.Count - 1)

                {

                    m_index++;

                    return true;

                }

                return false;

            }

 

            public bool IsDone()

            {

                return m_index == m_concreteAggregate.m_itemList.Count - 1;

            }

 

            public T CurrentItem()

            {

                return m_concreteAggregate.m_itemList[m_index];

            }

 

            #endregion

        }

    }

 

    /// <summary>

    /// 客户测试

    /// </summary>

    public class Client

    {

        public void Test()

        {

            string[] items = new string[] { "A", "B", "C", "D" };

            Aggregate<string> aggregate = new ConcreteAggregate<string>(items);

            Iterator<string> iterator = aggregate.CreateIterator();

            Console.WriteLine("Iterator Begin:");

            iterator.First();

            while (iterator.Next())

            {

                Console.WriteLine(iterator.CurrentItem());

            }

            Console.WriteLine("Iterator IsDone:" + iterator.IsDone().ToString());

        }

    }

 

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WalsonTung

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值