博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式之迭代器模式
阅读量:5151 次
发布时间:2019-06-13

本文共 2486 字,大约阅读时间需要 8 分钟。

什么是迭代器模式?

迭代器是针对集合对象而生的,提供了一种方法顺序访问一个聚合对象(可理解为集合对象)中各个元素,而又无需暴露该对象的内部表示,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。

从上图可以看出,迭代器模式由以下角色组成:

  • 迭代器角色(Iterator):迭代器角色负责定义访问和遍历元素的接口
  • 具体迭代器角色(ConcreteIteraror):具体迭代器角色实现了迭代器接口,并需要记录遍历中的当前位置。
  • 聚合角色(Aggregate):聚合角色负责定义获得迭代器角色的接口
  • 具体聚合角色(ConcreteAggregate):具体聚合角色实现聚合角色接口。

代码实现

/// /// 迭代器抽象类/// public abstract class Iterator{    public abstract object First();    public abstract object Next();    public abstract bool IsDone();    public abstract object CurrentItem();}/// /// 聚合抽象类/// public abstract class Aggregate{    public abstract Iterator CreateIterator();}/// /// 具体聚合类/// public class ConcreteAggregate : Aggregate{    private IList items = new List();    public override Iterator CreateIterator()    {        return new ConcreteIterator(this);    }    public object this[int index]    {        get { return items[index]; }        set { items.Insert(index, value); }    }    public int Count    {        get { return items.Count; }    }}/// /// 具体迭代器类/// public class ConcreteIterator : Iterator{    private ConcreteAggregate aggregate;    private int current = 0;    public ConcreteIterator(ConcreteAggregate aggregate)    {        this.aggregate = aggregate;    }    public override object CurrentItem()    {        return aggregate[current];    }    public override object First()    {        return aggregate[0];    }    public override bool IsDone()    {        return current == aggregate.Count;    }    public override object Next()    {        object ret = null;        current++;        if (current < aggregate.Count)        {            ret = aggregate[current];        }        return ret;    }}/// /// 调用/// /// static void Main(string[] args){    ConcreteAggregate a = new ConcreteAggregate();    a[0] = "xiaoming";    a[1] = "xiaohong";    Iterator.Iterator i = a.CreateIterator();    object item = i.First();    while (!i.IsDone())    {        Console.WriteLine("{0}请Say Hi!", i.CurrentItem());        i.Next();    }    Console.ReadLine();}

迭代器模式的优缺点

由于迭代器承担了遍历集合的职责,从而有以下的优点:

  • 迭代器模式使得访问一个聚合对象的内容而无需暴露它的内部表示,即迭代抽象。
  • 迭代器模式为遍历不同的集合结构提供了一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作

迭代器模式存在的缺点:

  • 迭代器模式在遍历的同时更改迭代器所在的集合结构会导致出现异常。所以使用foreach语句只能在对集合进行遍历,不能在遍历的同时更改集合中的元素。

迭代器模式的适用场景

在下面的情况下可以考虑使用迭代器模式:

  • 系统需要访问一个聚合对象的内容而无需暴露它的内部表示。
  • 系统需要支持对聚合对象的多种遍历。
  • 系统需要为不同的聚合结构提供一个统一的接口。

在.NET下,迭代器模式中的聚集接口和迭代器接口都已经存在了,其中IEnumerator接口扮演的就是迭代器角色,IEnumberable接口则扮演的就是抽象聚集的角色,只有一个GetEnumerator()方法,关于这两个接口的定义可以自行参考MSDN。

转载于:https://www.cnblogs.com/snaildev/p/7677597.html

你可能感兴趣的文章
Hadoop HBase概念学习系列之HBase里的宽表设计概念(表设计)(二十七)
查看>>
Kettle学习系列之Kettle能做什么?(三)
查看>>
【Mac + GitHub】之在另一台Mac电脑上下载GitHub的SSH链接报错
查看>>
Day03:Selenium,BeautifulSoup4
查看>>
awk变量
查看>>
mysql_对于DQL 的简单举例
查看>>
35. Search Insert Position(C++)
查看>>
[毕业生的商业软件开发之路]C#异常处理
查看>>
一些php文件函数
查看>>
有关快速幂取模
查看>>
Linux运维必备工具
查看>>
字符串的查找删除
查看>>
NOI2018垫底记
查看>>
快速切题 poj 1002 487-3279 按规则处理 模拟 难度:0
查看>>
Codeforces Round #277 (Div. 2)
查看>>
【更新】智能手机批量添加联系人
查看>>
NYOJ-128前缀式计算
查看>>
淡定,啊。数据唯一性
查看>>
深入理解 JavaScript 事件循环(一)— event loop
查看>>
Hive(7)-基本查询语句
查看>>