定義:html
迭代器模式,提供了一種方法順序訪問一個聚合對象中各個元素,而又不暴露該對象的內部表示。java
由於迭代器模式的普遍運用,如今高級語言如c#,java等自己已經把這個模式封裝在語言當中。例如:c#中的foreach in。c#
所以此處暫不對迭代器模式作詳細的介紹,下面簡單講述在書中看到的一些基礎知識:ide
IEumerator支持對非泛型集合的簡單迭代接口。post
public interface IEumerator { object Current { get; } bool MoveNext(); void Reset(); }
IEnumerable公開枚舉數,該枚舉數支持在非泛型集合上進行簡單迭代。this
public interface IEnumerable { IEumerator GetEnumerator(); }
簡單舉例:url
IList<string> strList = new List<string>(); strList.Add("a"); strList.Add("c"); strList .Add ("d"); foreach (string item in strList) { Console.WriteLine("{0}", item); }
基本實現:spa
abstract class Iterator { public abstract object First(); public abstract object Next(); public abstract object CurrentItem(); public abstract bool IsDone(); } 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 obj = null; current ++; if (current < aggregate.Count) obj = aggregate[current]; return obj; } public override object CurrentItem() { return aggregate[current]; } public override bool IsDone() { return current >= aggregate.Count ? true : false; } } abstract class Aggregate { public abstract Iterator CreateIterator(); } class ConcreteAggregate : Aggregate { private IList<object> items = new List<object>(); public int Count { get { return items.Count; } } public object this[int index] { get { return items[index]; } set { items.Insert(index, value); } } public override Iterator CreateIterator() { return new ConcreteIterator(this); } }
客戶端調用:code
ConcreteAggregate agg = new ConcreteAggregate(); agg[0] = "張三"; agg[1] = "李四"; agg[2] = "王五"; agg[3] = "麻子"; Iterator it = new ConcreteIterator(agg); object item = it.First(); while (!it.IsDone()) { Console.WriteLine("{0}點到名字了", it.CurrentItem()); it.Next(); }
項目中實現迭代器的實例:htm
public class StudentInfo { public int Id; public string Name; public StudentInfo(int id, string name) { this.Id = id; this.Name = name; } } public class SchoolInfo : IEnumerable { public StudentInfo[] stu = new StudentInfo[] { new StudentInfo(1, "tom"), new StudentInfo(2, "jack"), new StudentInfo(3, "john") }; public IEnumerator GetEnumerator() { return this.stu.GetEnumerator(); } }
客戶端調用:
SchoolInfo info = new SchoolInfo(); foreach (StudentInfo item in info.stu) Console.WriteLine("Id is {0},Name is {1}", item.Id, item.Name);
結果顯示以下:
此外還能夠查看Foreach遍歷
//