前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >设计模式之迭代器模式

设计模式之迭代器模式

作者头像
beginor
发布2020-08-10 11:17:39
发布2020-08-10 11:17:39
30800
代码可运行
举报
运行总次数:0
代码可运行

设计模式之迭代器模式

结构

说明

Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.

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

适用条件

迭代器模式是非常常见的设计模式之一, 适用条件很广, 需要访问聚合对象(数组、集合、列表等)的元素时, 即可使用迭代器模式。

实现

代码语言:javascript
代码运行次数:0
运行
复制
public interface IIterator {

   object CurrentItem();

   void First();

   bool IsDone();

   void Next();

}

public interface IAggregate {

   IIterator CreateIterator();
}

public class ConcreteIterator : IIterator {
   
   private readonly object[] _aggregateItems;
   private int _index;

   public ConcreteIterator(object[] aggregateItems) {
      this._aggregateItems = aggregateItems;
      this._index = 0;
   }

   public object CurrentItem() {
      return this._aggregateItems[this._index];
   }

   public void First() {
      this._index = 0;
   }

   public bool IsDone() {
      return this._index == this._aggregateItems.Length;
   }

   public void Next() {
      this._index += 1;
   }
}


public class ConcreateAggregate : IAggregate {

   private readonly object[] _items;

   public ConcreateAggregate(params object[] items) {
      if (items != null) {
         this._items = new object[items.Length];
         for (var i = 0; i < items.Length; i++) {
            this._items[i] = items[i];
         }
      }
   }
   
   public IIterator CreateIterator() {
      return new ConcreteIterator(this._items);
   }

}

class Client {

   static void Main(string[] args) {
      IAggregate aggregate = new ConcreateAggregate("Item1", "Item2", "Item3", "Item4");
      IIterator iterator = aggregate.CreateIterator();

      if (iterator.IsDone()) {
         iterator.First();
      }
      while (!iterator.IsDone()) {
         Console.WriteLine(iterator.CurrentItem());
         iterator.Next();
      }

      Console.ReadKey();
   }
}

.Net 内置了迭代器模式, 也称之为枚举器模式, 对应的接口类型为:

代码语言:javascript
代码运行次数:0
运行
复制
/// IEnumerator 对应 Iterator
public interface IEnumerator {

   object Current;

   bool MoveNext();

   void Reset();

}

/// IEnumerable 与  Aggregate 对应
public interface IEnumerable {

   IEnumerator GetEnumerator();

}

.Net 基础类库之中, 有很多类实现这两个接口, 比如: ArrayList, List, Collection, Hashtable 等。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 设计模式之迭代器模式
    • 结构
    • 说明
    • 适用条件
    • 实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档