什麼是迭代器模式
定義:提供一個方法順序來存取一個聚合物件中各個元素,而又不暴露該物件的內部顯示
下面是迭代器模式結構圖:
下面的範例程式碼簡單了解一下:
//抽象聚合类 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中文網其他相關文章!