一、引言 上篇博客中學習了命令模式,是將行為抽象為命令,使得行為請求者和接收者形成低耦合關係。我們知道行為型設計模式關註的是對象職責的分離,今天我們將學習一個新的設計模式,迭代器模式: 二、迭代器模式 定義:提供一種方法順序訪問一個聚合對象中各個元素,而又不暴露該對象的內部顯示 下麵是迭代器模式結構 ...
一、引言
上篇博客中學習了命令模式,是將行為抽象為命令,使得行為請求者和接收者形成低耦合關係。我們知道行為型設計模式關註的是對象職責的分離,今天我們將學習一個新的設計模式,迭代器模式:
二、迭代器模式
定義:提供一種方法順序訪問一個聚合對象中各個元素,而又不暴露該對象的內部顯示
下麵是迭代器模式結構圖:
下麵是代碼demo:
//抽象聚合類 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(); }View Code
分析:想一下,如果把集合對象和對集合對象的操作放在一起,當我們想換一種方式遍歷集合對象中元素時,就需要修改集合對象了,違背“單一職責原則”,而迭代器模式將數據結構和數據結構的演算法分離開,兩者可獨立發展。
優點:
1.支持多種遍歷方式。比如有序列表,我們根據需要提供正序遍歷、倒序遍歷兩種迭代器。用戶只需要得到我們的迭代器,就可以對集合執行遍歷操作
2.簡化了聚合類。由於引入了迭代器,原有的集合對象不需要自行遍歷集合元素了
3.增加新的聚合類和迭代器類很方便,兩個維度上可各自獨立變化
4.為不同的集合結構提供一個統一的介面,從而支持同樣的演算法在不同的集合結構上操作
缺點:
1.迭代器模式將存儲數據和遍曆數據的職責分離增加新的集合對象時需要增加對應的迭代器類,類的個數成對增加,在一定程度上增加系統複雜度
使用場景:
1.訪問一個聚合對象內容而無須暴露它的內部顯示
2.需要為聚合對象提供多種遍歷方式
3.為遍歷不同的聚合結構提供一個統一的介面
關於迭代器模式的學習就到此結束了,希望能夠幫到你,若有不足,歡迎斧正,感謝您的閱讀。