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

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

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

下面举例实现:

首先定义抽象聚集类和具体聚集类

///     /// 聚集抽象类    ///     abstract class Aggregate    {        public abstract Iterator CreateIterator();    }    ///     /// 具体的聚集类,CreateIterator方法能够返回一个该类型对应的具体的迭代器    ///     class ConcreteAggregate : Aggregate    {        private List item = new List();        public int Count        {            get { return item.Count; }        }        public object this[int index]        {            get { return item[index]; }            set { item.Insert(index,value); }        }        public override Iterator CreateIterator()        {            return new ConcreteIterator(this);        }    }

  下面定义一个抽象迭代器类和具体迭代器类

///     /// 迭代器抽象类    ///     abstract class Iterator    {        public abstract object First();        public abstract object Next();        public abstract bool IsDone();        public abstract object Current();    }    ///     /// 针对某一个具体的聚集对象的具体的迭代器    ///     class ConcreteIterator : Iterator    {        private ConcreteAggregate aggregate;        private int current = 0;        public ConcreteIterator(ConcreteAggregate aggregate)        {            this.aggregate = aggregate;        }        public override object First()        {            return aggregate[0];        }        public override object Next()        {            object next = null;            if (current + 1 < aggregate.Count)            {                next = aggregate[++current];            }            return next;        }        public override bool IsDone()        {            return current+1 >= aggregate.Count ? true : false;        }        public override object Current()        {            return aggregate[current];        }    }

 客户端使用具体迭代器访问具体聚集类中的成员:

ConcreteAggregate myAggregate = new ConcreteAggregate();            myAggregate[0] = 0;            myAggregate[1] = 1;            myAggregate[2] = 2;            ConcreteIterator iterator = (ConcreteIterator)myAggregate.CreateIterator();             Console.WriteLine(iterator.First());            while (!iterator.IsDone())            {                Console.WriteLine(iterator.Next());            }

 执行结果如下:

0

1

2

当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,你就应该考虑用迭代器模式。另外,当你需要对聚集类有多种遍历方式时,也可以考虑用迭代器模式。

总体而言,迭代器模就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴漏集合的内部结构,又可以让外部代码透明的访问集合内部的数据。

转载于:https://www.cnblogs.com/angela217/p/5461112.html

你可能感兴趣的文章