前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >通俗易懂设计模式解析——迭代器模式

通俗易懂设计模式解析——迭代器模式

作者头像
小世界的野孩子
发布2019-10-10 14:14:38
4220
发布2019-10-10 14:14:38
举报

前言

  今天我们一起看看行为模式中的迭代器模式,迭代是重复反馈过程的活动,其目的通常是为了接近并到达所需的目标或结果。在系统开发中简单说可以理解成遍历。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层或者内部表示。

迭代器模式介绍

一、来由

  在系统开发中,集合对象内部表示各不相同。底层构造也尽不相同。对于这些对象,我们希望在不暴露其底层和内部表示的同时,可以使外部客户访问其中元素。迭代器模式就为这一需求提供了极其优雅的实现。

二、意图

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

三、案例图

四、迭代器模式代码示例

我们从上面的案例图可见,迭代器模式主要包含以下四个部分:

抽象迭代器:定义了访问和遍历元素的接口,然后在其子类中实现这些方法。

具体迭代器:实现抽象迭代器接口,完成对集合对象的遍历。同时对遍历时的位置进行跟踪。

抽象聚合类:主要用于储存对象,创建相应的迭代器对象的接口。带有一个createIterator()方法用于创建迭代器对象。

具体聚合类:实现创建相应的迭代器对象的接口,实现createIterator()方法,并且返回与该具体聚合相对应的具体迭代器ConcreteIterator实例。

介绍完迭代器模式之后,接下来我们具体来看看迭代器模式的具体实现吧。具体如下:

namespace Iterator_Pattern
{
    class IteratorPattern
    {
    }

    /// <summary>
    /// 抽象聚合类、包含一个创建迭代器对象的方法
    /// </summary>
    public interface IListAggregate
    {
        Iterator GetIterator();
    }

    /// <summary>
    /// 抽象迭代器、包含访问和遍历元素的方法
    /// </summary>
    public interface Iterator
    {
        /// <summary>
        /// 是否有下一个元素
        /// </summary>
        /// <returns></returns>
        bool IsNext();
        /// <summary>
        /// 获取当前元素位置
        /// </summary>
        /// <returns></returns>
        object GetCurrentIndex();
        /// <summary>
        /// 获取下一个元素
        /// </summary>
        void Next();
        /// <summary>
        /// 获取第一个元素、相当于重置
        /// </summary>
        void Start();
    }

    /// <summary>
    /// 具体聚合类
    /// </summary>
    public class ConcreteListAggregate : IListAggregate
    { 
        string[] list;
        public ConcreteListAggregate()
        {
            list = new string[] { "张三", "李四", "王五", "赵六" };
        }

        /// <summary>
        /// 创建迭代器对象
        /// </summary>
        /// <returns></returns>
        public Iterator GetIterator()
        {
            return new ConcreteIterator(this);
        }

        /// <summary>
        /// 获取对象长度
        /// </summary>
        public int Length
        {
            get { return list.Length; }
        }

        /// <summary>
        /// 获取指定位置元素
        /// </summary>
        /// <param name="index"></param>
        /// <returns></returns>
        public object GetItem(int index)
        {
            return list[index];
        } 
    }

    public class ConcreteIterator : Iterator
    {
        private ConcreteListAggregate _list;
        private int _index;

        public ConcreteIterator(ConcreteListAggregate list)
        {
            _list = list;
            _index = 0;

        }

        public object GetCurrentIndex()
        {
            return _list.GetItem(_index);
        }

        public bool IsNext()
        {
            if (_index<_list.Length)
            {
                return true;
            }
            return false;
        }

        public void Next()
        {
            if (_index<_list.Length)
            {
                _index++;
            }
        }

        public void Start()
        {
            _index = 0;
        }
    }
}
namespace Iterator_Pattern
{
    class Program
    {
        static void Main(string[] args)
        {
            //获取迭代器对象

            IListAggregate listAggregate = new ConcreteListAggregate();
            Iterator iterator = listAggregate.GetIterator(); 
            while (iterator.IsNext())
            {
                var result = iterator.GetCurrentIndex();
                Console.WriteLine(result);
                iterator.Next();

            }
        }
    }
}

使用场景及优缺点

一、使用场景

1、访问聚合对象的内容不需要暴露其内部表示。

2、需要为聚合对象提供多种遍历方式。

3、为了遍历不同的聚合结构对象提供统一的接口

二、优点

1、访问聚合对象内容时无需暴露其内部表示。

2、迭代器模式为不同的聚合结构对象提供了统一的接口。

3、在同一个聚合对象上可以实现多种遍历。

4、增加新的聚合类和迭代类较为方便,无需修改之前的代码

三、缺点

1、迭代器模式将存储数据和遍历数据的责任进行了分离。增加新的聚合类型的时候需要增加新的迭代器类。存在成对增加的。增加了系统的复杂性。

总结

  迭代器模式到这里就介绍完了。迭代器模式就是通过迭代器类将集合对象的遍历行为进行区分开来。这样一来就可以不暴露集合对象的内部表示了。又可以使外部能正常的使用访问其元素。这个模式并不复杂。把握好其中每个角色的职责,进行连贯就好了。在.Net中我们也可以发现一个现成的迭代器模式。这也是最好的教程案例。IEnumerable作为了一个抽象聚合类、IEnumerator作为一个抽象迭代器。在System.Collections命名空间之下。有兴趣深究的可以去研究下。 

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-10-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 迭代器模式介绍
    • 一、来由
      • 二、意图
        • 三、案例图
          • 四、迭代器模式代码示例
          • 使用场景及优缺点
            • 一、使用场景
              • 二、优点
                • 三、缺点
                • 总结
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档