五个角色:迭代器(Iterator)、具体迭代器(ConcreteIterator)、聚合(Aggregate)、具体聚合(ConcreteAggregate)、客户端(Client) 

        迭代器(Iterator):定义遍历和访问元素的接口

        具体迭代器(ConcreteIterator):实现迭代器接口并且跟踪聚合对象当前位置

        聚合(Aggregate):定义一个迭代器对象接口

        具体聚合(ConcreteAggregate):实现迭代器对象,并且返回具体迭代器实例

        客户端(Client):调用迭代器对聚合对象进行遍历

实现思路:向具体聚合对象添加元素,然后调用迭代器遍历聚合对象

 类图:

极速理解设计模式系列:16.迭代器模式(Iterator Pattern)

应用场景:需要遍历新闻名称。

分析:首先建立一个聚合对象,然后在聚合对象中添加新闻的List,编写迭代器对新闻进行遍历即可。

        下面我们在控制台程序去演示一下如何使用Iterator Pattern:

        一、迭代器(Iterator):

 


  1. //迭代器(Iterator) 
  2. abstract class Iterator 
  3.     public abstract News First(); 
  4.     public abstract News Next(); 
  5.     public abstract bool IsOver(); 
  6.     public abstract News Current(); 

        二、具体迭代器(ConcreteIterator):

 


  1. //具体迭代器(ConcreteIterator) 
  2. class ConcreteIterator:Iterator 
  3.     public ConcreteCollect concretecollect; 
  4.  
  5.     int current = 0; 
  6.  
  7.     public ConcreteIterator(ConcreteCollect collect) 
  8.     { 
  9.         concretecollect = collect; 
  10.     } 
  11.  
  12.     public override News First() 
  13.     { 
  14.         return concretecollect[1]; 
  15.     } 
  16.  
  17.     public override News Next() 
  18.     { 
  19.         current++; 
  20.         return current >= concretecollect.Count ? null : concretecollect[current]; 
  21.     } 
  22.  
  23.     public override bool IsOver() 
  24.     { 
  25.         return current >= concretecollect.Count ? true : false
  26.     } 
  27.  
  28.     public override News Current() 
  29.     { 
  30.         return concretecollect[current]; 
  31.     } 

        三、聚合(Aggregate):

 


  1. //聚合(Aggregate) 
  2. abstract class Collect 
  3.     public abstract Iterator CreateIterator(); 

        四、具体聚合(ConcreteAggregate):

 


  1. //具体聚合(ConcreteAggregate) 
  2. class ConcreteCollect : Collect 
  3.     private List<News> collectList = new List<News>(); 
  4.  
  5.     public override Iterator CreateIterator() 
  6.     { 
  7.         return new ConcreteIterator(this); 
  8.     } 
  9.     public News this[int index
  10.     { 
  11.         get { return collectList[index]; } 
  12.         set { collectList.Insert(index,value); } 
  13.     } 
  14.  
  15.     public int Count { get { return collectList.Count; } } 

        五、客户端(Client):

 


  1. class Program 
  2.     static void Main(string[] args) 
  3.     { 
  4.         ConcreteCollect collect = new ConcreteCollect(); 
  5.         collect[0] = new News("今天的第一个新闻"); 
  6.         collect[1] = new News("今天的第二个新闻"); 
  7.         collect[2] = new News("今天的第三个新闻"); 
  8.         collect[3] = new News("今天的第四个新闻"); 
  9.         collect[4] = new News("今天的第五个新闻"); 
  10.  
  11.         Iterator iterator = new ConcreteIterator(collect); 
  12.         while (!iterator.IsOver()) 
  13.         { 
  14.             Console.WriteLine("这是:" + iterator.Current().Name); 
  15.             iterator.Next(); 
  16.         } 
  17.         Console.ReadLine(); 
  18.     } 

          元素:

 


  1. class News 
  2.     public News(string name
  3.     { 
  4.         this.Name = name
  5.     } 
  6.     public string Name{get;set;} 

        如需源码请点击 IteratorPattern.rar 下载。