C++ 设计模式之迭代器模式


设计模式之迭代器模式


迭代器模式,提供一种方法顺序访问一个聚合对象中各个元素,而不暴露该对象的内部表示。该模式很好理解,C++中的迭代器应该都用过,和那个差不多。其UML图如下:

ConcreteIterator内部有一个聚合对象的引用(指针),而ConcreteAggregate依赖于ConcreteIterator。以前向链表为例,示例代码如下:

1 // IteratorModel.h文件 2 #pragma once 3 #include <iostream> 4 // 单向链表 5 template<typename T> 6 class node 7 10 T data; 11 node * next; 12 }; 13 // 迭代器 14 template<typename T> 15 class IteratorBase 16 ; 23 24 template<typename T> 25 class Iterator; 26 // 单项链表 27 template<typename T> 28 class forwardlist 29 ; 54 // 具体的迭代器 55 template<typename T> 56 class Iterator : public IteratorBase<T> 57 68 T first() 69 72 T next() 73 83 T currentItem() 84 87 bool isDone() 88 93 T operator*() 94 97 }; 98 99 // forwardlist函数实现 100 // 创建迭代器函数 101 template<typename T> 102 Iterator<T> forwardlist<T>::createIterator() 103 106 107 template<typename T> 108 forwardlist<T>::forwardlist() : m_nLength(0u), m_HeadNode(nullptr) 109 112 113 template<typename T> 114 forwardlist<T>::~forwardlist() 115 119 120 template<typename T> 121 node<T> * forwardlist<T>::getNode(unsigned int index) 122 128 unsigned int n = 0; 129 node<T> * pnode = m_HeadNode; 130 while (n++ <= index) 131 134 return pnode; 135 } 136 137 template<typename T> 138 T forwardlist<T>::getElement(unsigned int index) 139 142 143 template<typename T> 144 T forwardlist<T>::getFirst() 145 148 149 template<typename T> 150 T forwardlist<T>::getTail() 151 156 return getElement(m_nLength 1); 157 } 158 159 template<typename T> 160 unsigned int forwardlist<T>::insertElement(unsigned int index, T elem) 161 167 node<T> * pnode = m_HeadNode; 168 unsigned int n = 0u; 169 while (n++ < index)// 定位到index上一个节点 170 173 // 插入节点 174 node<T> *pnodeElem = new node<T>; 175 pnodeElem>data = elem; 176 pnodeElem>next = pnode>next; 177 pnode>next = pnodeElem; 178 // 长度增加 179 m_nLength++; 180 return index; 181 } 182 183 template<typename T> 184 unsigned int forwardlist<T>::insertFirst(T elem) 185 188 189 template<typename T> 190 unsigned int forwardlist<T>::appendElement(T elem) 191 194 195 template<typename T> 196 unsigned int setValue(unsigned int index, T value) 197 203 node<T> * pnode = m_HeadNode; 204 while (n++ <= index)// 定位到index 205 208 pnode>data = value; 209 return index; 210 } 211 212 template<typename T> 213 T forwardlist<T>::deleteElement(unsigned int index) 214 220 unsigned int n = 0u; 221 node<T> * pnode = m_HeadNode; 222 while (n++ < index)// 定位到index上一个节点 223 226 // 删除节点 227 node<T> * pnodeTemp = pnode>next; 228 pnode>next = pnodeTemp>next; 229 T tTemp = pnodeTemp>data; 230 delete pnodeTemp; 231 pnodeTemp = nullptr; 232 // 长度减一 233 m_nLength; 234 return tTemp; 235 } 236 237 template<typename T> 238 void forwardlist<T>::deleteAll() 239 244 m_HeadNode>next = nullptr; 245 } 246 247 template<typename T> 248 unsigned int forwardlist<T>::getLength() 249 252 253 template<typename T> 254 bool forwardlist<T>::empty() 255 258 259 template<typename T> 260 node<T> * forwardlist<T>::getFirstNode() 261

测试代码如下:

1 #include <iostream> 2 #include "IteratorModel.h" 3 4 int main() 5

测试结果如下图:



上一篇:C++ 设计模式之简单工厂模式

下一篇:C++ 设计模式之外观模式


C/C&#x2B;&#x2B;
Copyright © 2002-2019 k262电脑网 www.k262.cn 皖ICP备2020016292号
温馨提示:部分文章图片数据来源与网络,仅供参考!版权归原作者所有,如有侵权请联系删除!QQ:251442993 热门搜索 网站地图