zoukankan      html  css  js  c++  java
  • 16、迭代器模式

    迭代器模式:

    迭代器模式(Iterator),提供一种方法顺序访问每一个聚合对象中的各个元素,而又不暴露该对象的内部表示。

    何时使用:
    当需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,就可以考虑使用迭代器模式。
    需要对聚集有多种遍历方式时,可以考虑使用迭代器模式。

    使用场景:
    访问数组,集合,列表等数据时,尤其是在操作数据库数据时,是非常普遍的应用,但是由于它过于普遍,很多高级语言都对它进行了封装。
    例:
    .Net中的foreach in
    Java中的for(Leaf leaf:childLeaf){…}

    迭代器模式UML结构图:

    基本代码:

      	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 ConcreteAggregate : Aggregate
        {
            private IList<object> items = new List<object>();  //声明一个IList泛型变量,用于存放聚合对象,用ArrayList同样可以实现
            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); }
            }
        }
    
        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 object CurrentItem()
            {
                return aggregate[current];
            }
    
            public override bool IsDone()
            {
                return current >= aggregate.Count ? true : false;
            }
    
        }
    
        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 ret = null;
                current--;
                if (current >= 0)
                {
                    ret = aggregate[current];
                }
    
                return ret;
            }
    
            public override object CurrentItem()
            {
                return aggregate[current];
            }
    
            public override bool IsDone()
            {
                return current < 0 ? true : false;
            }
    
        }
    	
     	class Program
        {
            static void Main(string[] args)
            {
                ConcreteAggregate a = new ConcreteAggregate();
    
                a[0] = "大鸟";
                a[1] = "小菜";
                a[2] = "行李";
                a[3] = "老外";
                a[4] = "公交内部员工";
                a[5] = "小偷";
    
                Iterator i = new ConcreteIterator(a);
                //Iterator i = new ConcreteIteratorDesc(a);
                object item = i.First();
                while (!i.IsDone())
                {
                    Console.WriteLine("{0} 请买车票!", i.CurrentItem());
                    i.Next();
                }
    
                Console.Read();
            }
        }
    

    当然上述代码我们可以直接采用.NET框架给出的接口完成,我们只负责实现就OK。

    例:foreach in在编译器中的工作:

    	foreach (string item in a)
    	{
       		Console.WriteLine("{0} 请买车票!", item);
    	}
    
    	//foreach in在编译器中的工作(实现IEumerator和IEnumerable两个接口来实现实际循环遍历,尽管我们不需要显示的引用迭代器,但是系统本身还是需要迭代器来实现遍历):
    	IEnumerator<string> e = a.GetEnumerator();
    	while (e.MoveNext())
    	{
    		Console.WriteLine("{0} 请买车票!", e.Current);
    	}
    
  • 相关阅读:
    [CF1166E] The LCMs Must be Large
    AtCoder Beginner Contest 161
    [CF1168B] Good Triple
    [CF1172B] Nauuo and Circle
    [CF1185E] Polycarp and Snakes
    [CF1187E] Tree Painting
    Codeforces Round #631 (Div. 2)
    [CF1200E] Compress Words
    Thinkphp绕过宝塔getshell
    如何成为一个漏洞赏金猎人
  • 原文地址:https://www.cnblogs.com/study-hard-forever/p/13166697.html
Copyright © 2011-2022 走看看