標籤:[1] object obj 導致 恢複 false over 方法 cti
引言
迭代器模式是針對集合對象而生的,對於集合對象而言,肯定會涉及到對集合的添加和刪除操作,同時也肯定支援遍曆集合元素的操作,我們此時可以把遍曆操作放在集合對象中,但這樣的話,集合對象既承擔太多的責任了,物件導向設計原則中有一條就是單一職責原則,所有我們要儘可能地分離這些職責,用不同的類取承擔不同的責任,迭代器模式就是用迭代器類來承擔遍曆集合的職責。
迭代器模式的介紹
迭代器模式提供了一種方法順序訪問一個彙總對象中的各個元素,而又無需暴露該對象的內部實現,這樣既可以做到不暴露集合的內部結構,又可讓外部代碼透明地訪問集合內部的資料
- 迭代器角色(Iterator):迭代器角色負責定義訪問和遍曆的介面
- 具體迭代器角色(Concrete Iterator):具體迭代器角色實現了迭代器介面,並需要記錄遍曆中的當前位置。
- 彙總角色(Aggregate):彙總角色負責定義獲得迭代器角色的介面
- 具體彙總角色(ConcreteAggregate):具體彙總角色實現彙總角色介面
迭代器代碼實現
class Program { static void Main(string[] args) { ConcreteAggregate a = new ConcreteAggregate(); a[0] = "a"; a[1] = "b"; a[2] = "c"; a[3] = "d"; a[4] = "e"; a[5] = "f"; a[6] = "g"; Iterator i = new ConcreteIterator(a); object item = i.First(); while (!i.IsDone()) { Console.WriteLine(i.CurrentItem()); i.Next(); } } } /// 迭代器介面 /// </summary> public abstract class Iterator { public abstract object First(); public abstract object Next(); public abstract bool IsDone(); public abstract object CurrentItem(); } //聚集抽象類別 public abstract class Aggregate { public abstract Iterator CreateIterator(); } /// <summary> /// 具體抽象類別 /// </summary> public 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); } } } public 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 ret = null; current++; if (current<aggregate.Count) { ret = aggregate[current]; } return ret; } public override bool IsDone() { return current >= aggregate.Count ? true : false; } public override object CurrentItem() { return aggregate[current]; } }View CodeNET中迭代器模式的應用
在mscorlib程式集裡有這樣一個命名空間,該命名空間就是:System.Collections,在該命名空間裡面早已有了迭代器模式的實現。對於聚集介面和迭代器介面已經存在了,其中IEnumerator扮演的就是迭代器的角色,它的實現如下:
public interface IEnumerator { object Current { get; } bool MoveNext(); void Reset(); }
屬性Current返回當前集合中的元素,Reset()方法恢複初始化指向的位置,MoveNext()方法傳回值true表示迭代器成功前進到集合中的下一個元素,傳回值false表示已經位於集合的末尾。能夠提供元素遍曆的集合對象,在.Net中都實現了IEnumerator介面。
IEnumerable則扮演的就是抽象聚集的角色,只有一個GetEnumerator()方法,如果集合對象需要具備跌代遍曆的功能,就必須實現該介面。
public interface IEnumerable{ IEumerator GetEnumerator();}
抽象彙總角色(Aggregate)和抽象迭代器角色(Iterator)分別是IEnumerable介面和IEnumerator介面,具體彙總角色(ConcreteAggregate)有Queue類型, BitArray等類型
迭代器模式的優缺點
由於迭代器承擔了遍曆集合的職責,從而有以下的優點:
- 迭代器模式使得訪問一個彙總對象的內容而無需暴露它的內部表示,即迭代抽象。
- 迭代器模式為遍曆不同的集合結構提供了一個統一的介面,從而支援同樣的演算法在不同的集合結構上進行操作
迭代器模式存在的缺陷:
- 迭代器模式在遍曆的同時更改迭代器所在的集合結構會導致出現異常。所以使用foreach語句只能在對集合進行遍曆,不能在遍曆的同時更改集合中的元素。
總結
迭代器模式就是抽象一個迭代器類來分離了集合對象的遍曆行為,這樣既可以做到不暴露集合的內部結構,又可讓外部代碼透明地訪問集合內部的資料
今天看到了一句話覺得很有道理,再此分享給大家 --我們今天的生活是由三五年前選擇決定的,而三五年後的生活是由今天決定的!晚安
c#設計模式系列:迭代器模式(Iterator)