/************************************************************************ * 迭代器模式学习笔记[C++] * Author: 陈相礼 * Time: 2009.12.12 * Compiler: VC8 ************************************************************************/ #include "IteratorPattern.h" #include <iostream> using namespace std; int main() { //------------------迭代器模式原理类测试------------------- CAggregate *ag = new CConcreteAggregate(); ag->bSetElement( "乘客1" ); ag->bSetElement( "乘客2" ); ag->bSetElement( "乘客3" ); ag->bSetElement( "乘客4" ); ag->bSetElement( "乘客5" ); ag->bSetElement( "乘客6" ); ag->bSetElement( "乘客7" ); ag->bSetElement( "乘客8" ); // 正向迭代器 CIterator* it = new CConcreteIterator( ag ); for ( ; !(it->IsDone()); it->Next() ) { cout << it->CurrentItem() << " 请买票~~~" << endl; } // 反向迭代器 CIterator* itdesc = new CConcreteIteratorDesc( ag ); for ( ; !(itdesc->IsDone()); itdesc->Next() ) { cout << itdesc->CurrentItem() << " 请买票~~~" << endl; } delete(ag); ag = NULL; delete(it); it = NULL; return 0; } /************************************************************************ * 总结: * 1、迭代器模式就是分离了集合对象的遍历行为,抽象出有一个迭代器类来负责, * 这样既可以做到不暴露集合的内部结构,又可以让外部代码透明地访问集合 * 内部的数据。 * 2、当需要对聚集有多种方式遍历时,可以考虑使用迭代器模式。 ************************************************************************/ #pragma once /********************************************** * 迭代器模式原理: * 提供一种方法顺序访问一个聚合对象中各个元素, * 而又不暴露该对象的内部表示。 * 当你需要访问一个聚集对象,而且不管这些对象 * 是什么都需要遍历的时候,你就应该考虑使用迭代 * 器模式。 * 遍历不同的聚集结构提供如开始、下一个、是否 * 结束、当前哪一项等统一的接口。 ***********************************************/ #include <iostream> #include <string> using namespace std; class CConcreteIterator; typedef string Object; //--------------------------------------------- // CIterator迭代器抽象类 // 用于定义得到开始对象,得到下一个对象,判断是 // 否到结尾、当前对象等抽象方法,统一接口。 class CIterator { public: virtual ~CIterator(){}; virtual Object First() = 0; virtual Object Next() = 0; virtual bool IsDone() = 0; virtual Object CurrentItem() = 0; protected: CIterator(){}; private: }; //--------------------------------------------- // CAggregate聚集抽象类 // 创建迭代器 class CAggregate { public: virtual ~CAggregate(){}; virtual CIterator* CreateIterator() = 0; virtual bool bSetElement( Object obj ) = 0; virtual Object GetItem( int idx ) = 0; virtual int GetSize() = 0; protected: CAggregate(){}; private: }; //--------------------------------------------- // CConcreteIterator具体迭代器类 // class CConcreteIterator : public CIterator { public: // 初始化时将具体的聚集对象传入 CConcreteIterator( CAggregate *aggregate, int idx = 0 ) { m_paggregate = aggregate; m_current = idx; } // 得到聚集的第一个对象 Object First() { m_current = 0; return m_paggregate->GetItem( 0 ); } // 得到聚集的下一个对象 Object Next() { m_current++; if ( m_current < m_paggregate->GetSize() ) { return m_paggregate->GetItem(m_current); } return ""; } // 判断当前是否遍历到结尾,到结尾返回true bool IsDone() { return ( m_current == m_paggregate->GetSize() ); } // 返回当前聚集对象 Object CurrentItem() { return m_paggregate->GetItem(m_current); } ~CConcreteIterator(){}; protected: private: // 定义一个具体的聚集对象 CAggregate *m_paggregate; int m_current; }; //--------------------------------------------- // CConcreteIteratorDesc具体迭代器类 // 反向迭代器 class CConcreteIteratorDesc : public CIterator { public: // 初始化时将具体的聚集对象传入 CConcreteIteratorDesc( CAggregate *aggregate ) { m_paggregate = aggregate; m_current = aggregate->GetSize(); } // 得到聚集的第一个对象 Object First() { m_current = m_paggregate->GetSize(); return m_paggregate->GetItem( m_current ); } // 得到聚集的下一个对象 Object Next() { m_current--; if ( m_current > 0 ) { return m_paggregate->GetItem(m_current - 1); } return ""; } // 判断当前是否遍历到结尾,到结尾返回true bool IsDone() { return ( m_current == 0 ); } // 返回当前聚集对象 Object CurrentItem() { return m_paggregate->GetItem(m_current - 1); } ~CConcreteIteratorDesc(){}; protected: private: // 定义一个具体的聚集对象 CAggregate *m_paggregate; int m_current; }; //--------------------------------------------- // CConcreteAggregate具体聚集类 // class CConcreteAggregate : public CAggregate { public: enum{ MAX_SIZE = 128 }; CConcreteAggregate(){}; ~CConcreteAggregate(){}; bool bSetElement( Object obj ) { _Object[_CurrentSize++] = obj; return _CurrentSize >= MAX_SIZE ? false : true; } CIterator* CreateIterator() { return new CConcreteIterator( this, 0 ); } // 返回聚集总个数 int GetSize() { return _CurrentSize; } Object GetItem( int idx ) { if ( idx < this->GetSize() ) { return _Object[idx]; } return NULL; } protected: private: // 泛型变量用来存放聚合对象 Object _Object[MAX_SIZE]; static int _CurrentSize; }; // 初始化静态成员变量 int CConcreteAggregate::_CurrentSize = 0;