设计模式--迭代器模式

概念
迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。
产品性质开始时会用到。


迭代器为谁服务
迭代器是为容器服务的,什么是容器呢?容器容器,肯定是能够容纳东西的,那么能容纳对象的所有类型都称为容器。而迭代器是遍历元素,元素是哪里的呢?就是容器中的元素。我们举一个例子:有一个售票员,她的工作就是提醒和监督人们买票,有一个问题售票员监督所有人买票吗?不是的,是根据她的工作地点和岗位来看,我们我具体化一个售票员,这个售票员是一个公交车的售票员,那么她所提醒和监督人们买票的容器就是此售票员所在的公交车,例如小红是2路公交车的售票员,那么她的工作就是提醒和监督她所在2路公交车上的乘客来买票,这两2路公交车在这里就是一个容器,再一个问题,小红遍历的是这辆2路公交车,还是在公交上的乘客呢?明显是公交上的乘客,乘客在这里就是元素的角色,也就验证了我们的这句话:迭代器模式就是为了遍历这个容器中的元素而诞生的。


结构图
设计模式--迭代器模式


角色

  • Aggregate
    容器角色负责提供创建具体迭代器角色的接口

  • ConcreteAggregate
    具体容器实现容器接口定义的方法–创建出容纳迭代器的对象。

  • Iterator
    抽象迭代器定义访问和遍历元素的接口。
    first()—获得第一个元素
    next()—访问下一个元素
    isdone()—是否已访问到底部

  • ConcreteIterator
    具体的迭代器角色,实现了迭代器接口,完成实际的容器元素的遍历。


迭代器实现

  • Aggregate
abstract class Aggregate//聚集抽象类
    {
        public abstract Iterator CreateIterator();//创建迭代器
    }
  • Iterator
abstract class Iterator//迭代具体类
    {
        public abstract object First();//获得第一个元素
        public abstract object Next();//访问下一个元素
        public abstract bool IsDone();//因为是判断是否到结尾所以用了布尔类型
        public abstract object CurrentItem();//当前项
    }
  • ConcreteIterator
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];//返回当前的聚集对象

        }

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

例子
前景描述:
公交车售票员提醒乘客买票
我们在前面已经写了迭代器的实现,那么现在只需要进行具体的实例化相应的类就好,客户端的代码:

static void Main(string[] args)
        {
            ConcreteAggregate a = new ConcreteAggregate();//a对象为公交车,也即是聚集对象

            a[0] = "1";//表示上车的新乘客
            a[1] = "2";
            a[2] = "3";
            a[3] = "4";
            a[4] = "5";
            a[5] = "6";
            a[6] = "7";

            Iterator i = new ConcreteIterator(a);

            object item = i.First();
            while (!i.IsDone())//从第一个乘客开始轮询
            {
                Console.WriteLine("{0}请买车票!", i.CurrentItem());//告知乘客买票
                i.Next();//下一个乘客
            }

            Console.Read();
        }

例子流程图
我们知道了例子的写法,但是例子到底是怎么运行的呢?实际运行中他们是怎么一起工作的呢?来看一下流程图吧~
设计模式--迭代器模式