设计模式(4)迭代器模式

概述


迭代器模式(Iterator):提供一种方法顺次访问聚合对象中各个元素,同时不暴露对象内部细节。

结构图


结构

迭代器抽象类(Iterator):负责定义访问和遍历元素的接口。

定义当前开始对象、得到下一个对象、得到下一个对象、判断是否结尾。将列表的访问和遍历从列表对象中分离,并放到迭代器对象(Iterator)中。


  1. //迭代器抽象类  
  2.     abstract class Iterator  
  3.     {  
  4.         public abstract object First();  
  5.         public abstract object Next();  
  6.         public abstract object IsDone();  
  7.         public abstract object CurrentItem();  
  8.     }  

具体迭代器(Concrete Iterator):实现迭代器接口,记录遍历中当前位置。

  1. //具体迭代器类,继承Iterator  
  2.     class ConcreteIterator : Iterator  
  3.     {  
  4.         private ConcreteAggregate aggregate;  
  5.         private int current = 0;  
  6.   
  7.         public ConcreteIterator(ConcreteAggregate aggregate)  
  8.         {  
  9.             this.aggregate = aggregate;  
  10.         }  
  11.   
  12.         public override object First()  
  13.         {  
  14.             return aggregate [0];  
  15.         }  
  16.   
  17.         public override object Next()  
  18.         {  
  19.             object ret = null;  
  20.             current++;  
  21.             if (current < aggregate.count)   
  22.             {  
  23.                 ret = aggregate [current];  
  24.             }  
  25.             return ret;  
  26.         }  
  27.   
  28.         public override bool  IsDone()  
  29.         {  
  30.             return current >=aggregate .count ?true:false ;  
  31.         }  
  32.   
  33.         public override object CurrentItem()  
  34.         {  
  35.             return aggregate [current ];  
  36.         }  
  37.     }  

聚集抽象类(Aggregate):提供创建具体迭代器的接口。


  1. //聚集抽象类  
  2.     abstract class Aggreate  
  3.     {  
  4.         public abstract Iterator CreateIterator();  
  5.     }  


具体聚集类(ConcreteAggregate):存放聚合对象,返回聚集的个数并声明一个索引器。

  1. //具体聚集类  
  2.     class ConcreteAggregate : Aggreate  
  3.     {  
  4.         private IList<object > items =new List <object >();  
  5.         public override Iterator CreateIterator()  
  6.         {  
  7.             return new ConcreteIterator(this );  
  8.         }  
  9.   
  10.         public int count  
  11.         {  
  12.             get { return items.Count; }  
  13.         }  
  14.   
  15.         public object this[int index]  
  16.         {  
  17.             get { return items[index]; }  
  18.             set { items.Insert(index, value); }  
  19.         }  
  20.     }  

客户端

  1. static void Main(string[] args)  
  2.         {  
  3.             ConcreteAggregate a = new ConcreteAggregate();  
  4.   
  5.             a[0] = "persona";  
  6.             a[1] = "personb";  
  7.   
  8.             Iterator   i =new ConcreteIterator (a );  
  9.   
  10.             object item = i.First();  
  11.   
  12.             while (!i.IsDone())  
  13.             {  
  14.                 Console.WriteLine("{0}请先买票!",i.CurrentItem ());  
  15.                 i.Next();  
  16.             }  
  17.             Console.ReadLine();  
  18.         } 
原文地址:https://www.cnblogs.com/guziming/p/4232750.html