什么是迭代器模式
定义:提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部显示
下面是迭代器模式结构图:
下面的示例代码简单了解一下:
//抽象聚合类 abstract class Aggregate { public abstract Iterator CreateIterator(); } //具体聚合类 class ConcreteAggregate : Aggregate { private IList<object> items = new List<object>(); public override Iterator CreateIterator() { return new ConcreteIterator(this); } public int Count { get { return items.Count; } } public object this[int index] { get { return items[index]; } set { items.Insert(index, value); } } } //抽象迭代器类 abstract class Iterator { public abstract object First(); public abstract object Next(); public abstract bool IsDone(); public abstract object CurrentItem(); } //具体迭代器类 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 ? true : false; } public override object Next() { object ret = null; Current++; if(Current<aggregate.Count) { ret = aggregate[Current]; } return ret; } } static void Main(string[] args) { ConcreteAggregate aggregate = new ConcreteAggregate(); aggregate[0] = "michael"; aggregate[1] = "jarle"; aggregate[2] = "cumming"; aggregate[3] = "andy"; ConcreteIterator iterator = new ConcreteIterator(aggregate); iterator.First(); while (!iterator.IsDone()) { Console.WriteLine($"{iterator.CurrentItem()},请打卡后再下班"); iterator.Next(); } Console.Read(); }
分析:想一下,如果把集合对象和对集合对象的操作放在一起,当我们想换一种方式遍历集合对象中元素时,就需要修改集合对象了,违背“单一职责原则”,而迭代器模式将数据结构和数据结构的算法分离开,两者可独立发展。
优点:
1.支持多种遍历方式。比如有序列表,我们根据需要提供正序遍历、倒序遍历两种迭代器。用户只需要得到我们的迭代器,就可以对集合执行遍历操作
2.简化了聚合类。由于引入了迭代器,原有的集合对象不需要自行遍历集合元素了
3.增加新的聚合类和迭代器类很方便,两个维度上可各自独立变化
4.为不同的集合结构提供一个统一的接口,从而支持同样的算法在不同的集合结构上操作
缺点:
1.迭代器模式将存储数据和遍历数据的职责分离增加新的集合对象时需要增加对应的迭代器类,类的个数成对增加,在一定程度上增加系统复杂度
使用场景:
1.访问一个聚合对象内容而无须暴露它的内部显示
2.需要为聚合对象提供多种遍历方式
3.为遍历不同的聚合结构提供一个统一的接口
以上是php的迭代器是什么的详细内容。更多信息请关注PHP中文网其他相关文章!