织梦CMS - 轻松建站从此开始!

罗索

设计模式 - Iterator 模式(迭代器模式)

jackyhwei 发布于 2011-05-03 22:56 点击:次 
Iterator提供一种方法顺序访问一个聚合对象中各个元素,,而又不需暴露该对象的内部表示。Iterator几乎是大部分人在初学C++的时候就无意之中接触到的第一种设计模式,因为在STL之中,所有的容器类都有与之相关的迭代器.
TAG:

作用:提供一种方法顺序访问一个聚合对象中各个元素,,而又不需暴露该对象的内部表示。

UML结构图:

 

解析: 

Iterator几乎是大部分人在初学C++的时候就无意之中接触到的第一种设计模式,因为在STL之中,所有的容器类都有与之相关的迭代器.以前初学STL的时候,时常在看到讲述迭代器作用的时候是这么说的:提供一种方式,使得算法和容器可以独立的变化,而且在访问容器对象的时候不必暴露容器的内部细节,具体是怎么做到这一点的呢?在STL的实现中,所有的迭代器(Iterator)都必须遵照一套规范,这套规范里面定义了几种类型的名称,比如对象的名称,指向对象的指针的名称,指向对象的引用的名称....等等,当新生成一个容器的时候与之对应的Iterator都要遵守这个规范里面所定义的名称,这样在外部看来虽然里面的实现细节不一样,但是作用(也就是对外的表象)都是一样的,通过某个名称可以得到容器包含的对象,通过某个名称可以得到容器包含的对象的指针等等的.而且,采用这个模式把访问容器的重任都交给了具体的iterator类中.于是,在使用Iterator来访问容器对象的算法不需要知道需要处理的是什么容器,只需要遵守事先约定好的Iterator的规范就可以了;而对于各个容器类而言,不管内部的事先如何,是树还是链表还是数组,只需要对外的接口也遵守Iterator的标准,这样算法(Iterator的使用者)和容器(Iterator的提供者)就能很好的进行合作,而且不必关心对方是如何事先的,简而言之,Iterator就是算法和容器之间的一座桥梁.在下面的实现中,抽象基类Iterator可以看做是前面提到的Iterator的规范,它提供了所有Iterator需要遵守的规范也就是对外的接口,而它的派生类ConcreateIterator则是ConcreateAggregate容器的迭代器,它遵照这个规范对容器进行迭代和访问操作.

代码实现:

Iterator.h

  1. #ifndef ITERATOR_H 
  2. #define ITERATOR_H 
  3.  
  4. typedef int DATA; 
  5.  
  6. class Iterater; 
  7.  
  8. // 容器的抽象基类 
  9. class Aggregate 
  10. public
  11.     virtual ~Aggregate(){} 
  12.  
  13.     virtual Iterater* CreateIterater(Aggregate *pAggregate) = 0; 
  14.     virtual int GetSize() = 0; 
  15.     virtual DATA GetItem(int nIndex) = 0; 
  16. }; 
  17.  
  18. // 迭代器的抽象基类 
  19. class Iterater 
  20. public
  21.     virtual ~Iterater(){} 
  22.  
  23.     virtual void First()        = 0; 
  24.     virtual void Next()            = 0; 
  25.     virtual bool IsDone()        = 0; 
  26.     virtual DATA CurrentItem()    = 0; 
  27.  
  28. private
  29. }; 
  30.  
  31. // 一个具体的容器类,这里是用数组表示 
  32. class ConcreateAggregate 
  33.     : public Aggregate 
  34. public
  35.     ConcreateAggregate(int nSize); 
  36.     virtual ~ConcreateAggregate(); 
  37.  
  38.     virtual Iterater* CreateIterater(Aggregate *pAggregate); 
  39.     virtual int GetSize(); 
  40.     virtual DATA GetItem(int nIndex); 
  41.  
  42. private
  43.     int m_nSize; 
  44.     DATA *m_pData; 
  45. }; 
  46.  
  47. // 访问ConcreateAggregate容器类的迭代器类 
  48. class ConcreateIterater 
  49.     : public Iterater 
  50. public
  51.     ConcreateIterater(Aggregate* pAggregate); 
  52.     virtual ~ConcreateIterater(){} 
  53.  
  54.     virtual void First(); 
  55.     virtual void Next(); 
  56.     virtual bool IsDone(); 
  57.     virtual DATA CurrentItem(); 
  58.  
  59. private
  60.     Aggregate  *m_pConcreateAggregate; 
  61.     int            m_nIndex; 
  62. }; 
  63.  
  64. #endif 

Iterator.cpp

  1. #include <iostream> 
  2. #include "Iterator.h" 
  3.  
  4. ConcreateAggregate::ConcreateAggregate(int nSize) 
  5.     : m_nSize(nSize) 
  6.     , m_pData(NULL) 
  7.     m_pData = new DATA[m_nSize]; 
  8.     
  9.     for (int i = 0; i < nSize; ++i) 
  10.     { 
  11.         m_pData[i] = i; 
  12.     } 
  13.  
  14. ConcreateAggregate::~ConcreateAggregate() 
  15.     delete [] m_pData; 
  16.     m_pData = NULL; 
  17.  
  18. Iterater* ConcreateAggregate::CreateIterater(Aggregate *pAggregate) 
  19.     return new ConcreateIterater(this); 
  20.  
  21. int ConcreateAggregate::GetSize() 
  22.     return m_nSize; 
  23.  
  24. DATA ConcreateAggregate::GetItem(int nIndex) 
  25.     if (nIndex < m_nSize) 
  26.     { 
  27.         return m_pData[nIndex]; 
  28.     } 
  29.     else 
  30.     { 
  31.         return -1; 
  32.     } 
  33. ConcreateIterater::ConcreateIterater(Aggregate* pAggregate) 
  34.     : m_pConcreateAggregate(pAggregate) 
  35.     , m_nIndex(0) 
  36. void ConcreateIterater::First() 
  37.     m_nIndex = 0; 
  38. void ConcreateIterater::Next() 
  39.     if (m_nIndex < m_pConcreateAggregate->GetSize()) 
  40.     { 
  41.         ++m_nIndex; 
  42.     } 
  43.  
  44. bool ConcreateIterater::IsDone() 
  45.     return m_nIndex == m_pConcreateAggregate->GetSize(); 
  46. DATA ConcreateIterater::CurrentItem() 
  47.     return m_pConcreateAggregate->GetItem(m_nIndex); 

main.cpp

  1. #include "Iterator.h" 
  2. #include <iostream> 
  3. int main() 
  4.     Aggregate* pAggregate = new ConcreateAggregate(4); 
  5.     Iterater*  pIterater  = new ConcreateIterater(pAggregate); 
  6.     for (; false == pIterater->IsDone(); pIterater->Next()) 
  7.     { 
  8.         std::cout << pIterater->CurrentItem() << std::endl; 
  9.     } 
  10.  
  11.     return 0; 
(whiteyun)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201105/11385.html]
本文出处:cnblogs.com/whiteyun 作者:whiteyun
顶一下
(1)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容