设计模式——迭代器模式

迭代器模式(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
  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值