标签:20 迭代 pAggregate virtual --- nCurrent CObject 016 return
简述:
迭代器模式:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。
迭代器模式包括:抽象聚集类、具体聚集类、抽象迭代类、具体迭代类。
抽象聚集类:封装一个抽象迭代类对象。
具体聚集类:继承自抽象聚集类。
抽象迭代类:用于定义得到开始对象、得到下一个对象、判断是否到结尾、当前对象等抽象方法,统一接口。
具体迭代类:继承自抽象迭代类,实现开始、下一个、是否结尾、当前对象等方法。
迭代器模式:
1 #include <iostream> 2 #include <list> 3 using namespace std; 4 5 class CObject 6 { 7 public: 8 string m_szData; 9 10 public: 11 CObject(string szData) : m_szData(szData){} 12 }; 13 14 // 抽象迭代器类 15 class CIterator 16 { 17 public: 18 virtual CObject* First() = 0; 19 virtual CObject* Next() = 0; 20 virtual bool IsDone() = 0; 21 virtual CObject* CurrentItem() = 0; 22 }; 23 24 // 抽象聚集类 25 class CAggregate 26 { 27 public: 28 virtual CIterator* CreateIterator(CIterator* pIterator) = 0; 29 }; 30 31 // 具体聚集类 32 class CConcreteAggregate : public CAggregate 33 { 34 private: 35 list<CObject*> m_lstItems; 36 CIterator* m_pIterator; 37 38 public: 39 virtual CIterator* CreateIterator(CIterator* pIterator) 40 { 41 m_pIterator = pIterator; 42 return m_pIterator; 43 } 44 45 int Count() { return m_lstItems.size(); } 46 47 CObject* operator[](int nIndex) 48 { 49 CObject* pObj = NULL; 50 if (nIndex > m_lstItems.size() - 1) 51 return pObj; 52 53 list<CObject*>::iterator ite = m_lstItems.begin(); 54 int n = 0; 55 while (ite != m_lstItems.end()) 56 { 57 if (n == nIndex) 58 { 59 pObj = (*ite); 60 break; 61 } 62 63 n++; 64 ite++; 65 } 66 67 return pObj; 68 } 69 70 list<CObject*>& GetList() { return m_lstItems; } 71 }; 72 73 // 具体迭代类 74 class CConcreteIterator : public CIterator 75 { 76 private: 77 CConcreteAggregate* m_pAggregate; 78 int m_nCurrent; 79 80 public: 81 CConcreteIterator(CConcreteAggregate* pAggregate) 82 { 83 m_pAggregate = pAggregate; 84 m_nCurrent = 0; 85 } 86 87 virtual CObject* First() { return (*m_pAggregate)[0]; } 88 89 virtual CObject* Next() 90 { 91 CObject* pObject = NULL; 92 m_nCurrent++; 93 if (m_nCurrent < m_pAggregate->Count()) 94 pObject = (*m_pAggregate)[m_nCurrent]; 95 96 return pObject; 97 } 98 99 virtual bool IsDone() { return m_nCurrent >= m_pAggregate->Count() ? true : false; } 100 101 virtual CObject* CurrentItem() { return (*m_pAggregate)[m_nCurrent]; } 102 }; 103 104 // 具体反向迭代类 105 class CConcreteIteratorDesc : CIterator 106 { 107 private: 108 CConcreteAggregate* m_pAggregate; 109 int m_nCurrent; 110 111 public: 112 CConcreteIteratorDesc(CConcreteAggregate* pAggregate) 113 { 114 m_pAggregate = pAggregate; 115 m_nCurrent = m_pAggregate->Count() - 1; 116 } 117 118 virtual CObject* First() { return (*m_pAggregate)[m_pAggregate->Count() - 1]; } 119 120 virtual CObject* Next() 121 { 122 CObject* pObject = NULL; 123 m_nCurrent--; 124 if (m_nCurrent < m_pAggregate->Count()) 125 pObject = (*m_pAggregate)[m_nCurrent]; 126 127 return pObject; 128 } 129 130 virtual bool IsDone() { return m_nCurrent < 0 ? true : false; } 131 132 virtual CObject* CurrentItem() { return (*m_pAggregate)[m_nCurrent]; } 133 }; 134 135 int main() 136 { 137 CConcreteAggregate Aggregate; 138 CObject obj("GGG"), obj1("HHH"), obj2("LLL"); 139 Aggregate.GetList().push_back(&obj); 140 Aggregate.GetList().push_back(&obj1); 141 Aggregate.GetList().push_back(&obj2); 142 143 //CConcreteIterator Iterator(&Aggregate); 144 CConcreteIteratorDesc Iterator(&Aggregate); 145 CObject* pObj = Iterator.First(); 146 while (!Iterator.IsDone()) 147 { 148 cout << Iterator.CurrentItem()->m_szData << " 请买车票!" << endl; 149 Iterator.Next(); 150 } 151 152 system("pause"); 153 return 0; 154 }
输出结果:
标签:20,迭代,pAggregate,virtual,---,nCurrent,CObject,016,return 来源: https://www.cnblogs.com/SmallAndGreat/p/13614388.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。