《大话设计模式》--想走?可以!先买票--迭代器模式<Iterator>(20)

来源:互联网 发布:大学生找不到工作数据 编辑:程序博客网 时间:2024/06/07 17:44

I:提供一种方法顺序访问一个聚合对象中各个元素,而不暴露该对象的内部表示。

当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,你就应该考虑用迭代器模式。你需要对聚集有多种方式遍历时,可以考虑用迭代器模式。为遍历不同的聚集结构提供如开始、下一个、是否结束、当前哪一项等统一的接口。

abstract class Iterator    {        public abstract object First();        public abstract object Next();        public abstract bool IsDone();        public abstract object CurrentItem();    }


 

abstract class Aggregate    {        public abstract Iterator CreateIterator();    }


 

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 bool IsDone()        {            return current >= aggregate.Count ? true : false;        }        public override object CurrentItem()        {            return aggregate[current];        }    }


 

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); }        }    }

 

            ConcreteAggregate aggregate = new ConcreteAggregate();                       aggregate[0] = "大鸟";            aggregate[1] = "小菜";            aggregate[2] = "行李";            aggregate[3] = "老外";            aggregate[4] = "公交内部员工";            aggregate[5] = "小偷";            //Iterator i = new ConcreteIterator(aggregate);            Iterator i = new ConcreteIteratorDesc(aggregate);            object item = i.First();            while (!i.IsDone())            {                Console.WriteLine(string.Format("{0} 请买票", i.CurrentItem()));                i.Next();            }


 


以上代码是从前到后的迭代,如果我们需要从后往前迭代,则可添加如下类:

class ConcreteIteratorDesc:Iterator    {        private ConcreteAggregate aggregate;        private int current = 0;        public ConcreteIteratorDesc(ConcreteAggregate aggregate)        {            this.aggregate = aggregate;            current = aggregate.Count - 1;        }        public override object First()        {            return aggregate[aggregate.Count - 1];        }        public override object Next()        {            object obj = null;            current--;            if (current >= 0)            {                obj = aggregate[current];            }            return obj;        }        public override object CurrentItem()        {            return aggregate[current];        }        public override bool IsDone()        {            return current < 0 ? true : false;        }    }

 

.NET迭代器实现:

            IList<string> iterator = new List<string>();            iterator.Add("大鸟");            iterator.Add("小菜");            iterator.Add("行李");            iterator.Add("老外");            iterator.Add("公交内部员工");            iterator.Add("小偷");            foreach (string item in iterator)            {                Console.WriteLine(string.Format("{0} 请买票", item));            }


迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。

0 0
原创粉丝点击