迭代器模式(Iterator)
迭代器模式是一种行为设计模式, 让你能在不暴露集合底层表现形式 (列表、 栈和树等) 的情况下遍历集合中所有的元素。
提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象中的内部表示
当我们要访问一个聚合对象,而且不管这些对象是什么都需要遍历的时候,应该考虑使用迭代器模式,另外当需要对聚集对象有多种方式遍历时,也可以考虑迭代器模式。
迭代器模式为遍历不同的聚集结构提供了诸如开始、下一个、是否结束、当前哪一项等统一的接口
现在高级语言已经将这个模式用在语言本身,学习价值大于使用价值。
#include <iostream>
#include <string>
#include <vector>using namespace std;// C++ 有自己的迭代器实现,可以与标准库定义的不同泛型容器一起使用。template <typename T, typename U>
class Iterator{
public:typedef typename std::vector<T>::iterator iter_type;Iterator(U *p_data, bool reverse = false):m_p_data_(p_data){m_it_ = m_p_data_->m_data_.begin();}void First(){m_it_ = m_p_data_->m_data_.begin();}void Next(){m_it_++;}bool IsDone(){return (m_it_ == m_p_data_->m_data_.end());}iter_type Current(){return m_it_;}private : U *m_p_data_;iter_type m_it_;
};// 通用集合/容器提供了一种或多种方法来检索与集合类兼容的新迭代器实例。template <class T>
class Container{friend class Iterator<T, Container>;
public:void Add(T a){m_data_.push_back(a);}Iterator<T, Container> *CreateIterator(){return new Iterator<T, Container>(this);}
private:vector<T> m_data_;
};// 自定义类
class Data{
public:Data(int a=0):m_data_(a){}void set_data(int a){m_data_ = a;}int data(){return m_data_;}private:int m_data_;
};// 客户端代码可能知道也可能不知道具体迭代器或集合类,对于此实现,容器是通用的,因此可以与 int 或自定义类一起使用。
void Client(){cout << "________________Iterator with int______________________________________" << endl;Container<int> cont;for (int i = 0; i<10; i++){cont.Add(i);}Iterator<int, Container<int>> *it = cont.CreateIterator();for (it->First(); !it->IsDone(); it->Next()){cout << *it->Current() << endl;}Container<Data> cont2;Data a(100), b(200), c(300);cont2.Add(a);cont2.Add(b);cont2.Add(c);cout << "________________Iterator with custom Class______________________________" << endl;Iterator<Data, Container<Data>> *it2 = cont2.CreateIterator();for (it2->First(); !it2->IsDone(); it2->Next()){cout << it2->Current()->data() << endl;}delete it;delete it2;
}int main(){Client();return 0;
}
输出:
________________Iterator with int______________________________________
0
1
2
3
4
5
6
7
8
9
________________Iterator with custom Class______________________________
100
200
300