设计模式学习笔记--Iterator Pattern迭代者模式

   所谓迭代者模式就是:提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。[GOF 《设计模式》] 
  在软件的构建过程中,集合对象(也就是聚集:是一组数据集或者对象集,它可以通过循环来访问 )内部结构常常变化各异。但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码透明地访问其中包含的元素;同时这种“透明遍历”也为“同一种算法在多种集合对象上进行操作”提供了可能。使用面向对象技术将这种遍历机制抽象为“迭代器对象”为“应对变化中的集合对象”提供了一种比较好的方式。
  我们在平时的开发中经常直接或间接地使用到此模式,我们使用foreach语句来循环就是在间接的使用C# Iterator迭代器模式。
  迭代器就像指针一样可以向前向后移动,在.NET中迭代器只能向后移动。
  此模式的UML图如下:

                        

  由图可知,它有以下角色

     1、Aggregate 接口:抽象的聚集,通常只留有一个方法让子类去实现,这个方法的作用是获得一个枚举器对象,通常可以起名字为 GetIterator( ),CreateIterator( ) 等等,或者干脆叫做 Iterator( ) 也行。在 C# 中,这个方法的名字叫做 GetEnumerator( ) ,这个我们到后面再讲。当然,在获得枚举器的同时,也要把自己 this(一组数据集)当作参数传给枚举器,想想也是,如果没有数据集,枚举器去枚举什么呢?
     2、ConcreteAggregate 类:具体的聚集,它的实例保存了一组数据集,同时它实现了 Aggregate 接口中唯一的那个方法,通常情况下他也会扩展出一些其他方法便于访问聚集中的数据,常见的有:访问某个位置数据的方法,可以叫做 GetElement(int index) 或者 GetItem(int index) 等等;获得聚集大小的方法,可以起名字为 GetLength( ) 或者 GetSize( ) 等等,全看自己喜好。我们这里叫Count。
     3、Iterator 接口:抽象的枚举器,通常情况下会有三个方法留给子类去实现,他们分别是:Next( ) ,用来把指针移动到聚集中的下一个数据;HasNext( ) ,用来判断是否还有下一个数据;CurrentItem( ),返回当前指针所指位置的数据。也可以把 Next( ) 和 CurrentItem( ) 组成一个方法,在移动指针的同时返回一个数据。也可以有其他的实现方式,或者简单,或者复杂,也是全看个人需求。
     4、ConcreteIterator 类:具体的枚举器,它实现了上述的三个方法,通过不同的实现方式,我们可以获得不同的枚举方式,如顺序枚举、倒序枚举等等。当然,这个类的构造方法中会接受一个具体聚集参数,想想也是,如果没有这个数据集,他去枚举什么呢?这个参数就是他要去枚举的对象。
     5、被聚集的类,这个可以是任何类,它的许多个对象被存到聚集对象中才能形成一个真正的聚集。
   下面,我们用两段代码来示例此模式。
   程序如下图:   
                        
  一、迭代者模式运基本思想示例
   1、Aggregate 接口:Aggregate.

Code

   2、ConcreteAggregate 类:

Code

   3、Iterator 接口

Code

   4、ConcreteIterator 类:

Code

   5、被聚集的类,此处我们用字符串来实现
  6、客户端应用

Code

 

  二、以士兵作为被聚集的类来示例实现
   1、Aggregate 接口:IAbstractCollection接口

Code

   2、ConcreteAggregate 类: SoldierCollection类

Code

   3、Iterator 接口: IAbstractIterator接口

Code

   4、ConcreteIterator 类:SoldierIterator类

Code

   5、被聚集的类:Soldier

Code

  6、客户端应用 

Code

  运行效果如下:
                          


 

前往:设计模式学习笔记清单
posted @ 2009-10-12 09:25  wsdj  阅读(656)  评论(0编辑  收藏  举报