設計模式(23)---迭代器模式 Foreach遍歷

定義: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);
        }
    }
View Code

客戶端調用: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();
            }
View Code

 

項目中實現迭代器的實例: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();
        }
    }
View Code

客戶端調用:

SchoolInfo info = new SchoolInfo();
foreach (StudentInfo item in info.stu) Console.WriteLine("Id is {0},Name is {1}", item.Id, item.Name);

結果顯示以下:

 

此外還能夠查看Foreach遍歷

//

相關文章
相關標籤/搜索