ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

迭代器模式

2019-02-16 13:38:14  阅读:287  来源: 互联网

标签:迭代 Iterator virtual 模式 pIterator Aggregate QString


一、简介

1. 定义
提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露该对象的内部表示。
2. 应用场景
1)访问一个聚合对象的内容而无需暴露它的内部表示;
2)提供对聚合对象的多种遍历;
3)为遍历不同的聚合结构提供一个统一的接口,即支持多态迭代。
3. 优点
1)简化了类的聚合接口;
2)封装了对象的内部数据,降低耦合;
3)应用广泛,现在很多的库都提供了迭代功能,不需要程序员再重复造轮子。
4. 缺点
1)由于实现代码较为复杂,不太适应于简单的数据结构对象。
二、类图

 

Iterator:定义迭代器访问和遍历元素的接口;
ConcreteIterator:实现具体的迭代器;
Aggregate:定义的容器,创建相应迭代器对象的接口;
ConcreteAggregate:具体的容器实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例。
三、代码示例
本文以遍历书柜上的图书为例,简单实现迭代器模式:

#ifndef ITERATOR_H
#define ITERATOR_H

#include <QString>
#include <QVector>
#include <QDebug>

using namespace std;


class Iterator
{
public:
    Iterator() {};
    virtual ~Iterator() {};
    virtual QString            First() = 0;
    virtual QString            Next() = 0;
    virtual QString            GetCur() = 0;
    virtual bool            IsEnd() = 0;
};

class Aggregate
{
public:
    Aggregate() {};
    virtual ~Aggregate() {};

    virtual int                Count() = 0;
    virtual void            Push(const QString& strValue) = 0;
    virtual QString            Pop(int nIndex) = 0;
    virtual Iterator*        CreateIterator() = 0;
};

class BookIterator : public Iterator
{
public:
    BookIterator(Aggregate* pAggregate)
        :m_nCurrent(0)
        , Iterator()
    {
        m_Aggregate = pAggregate;
    }
    QString First()
    {
        return m_Aggregate->Pop(0);
    }
    QString Next()
    {
        QString strRet;
        m_nCurrent++;
        if (m_nCurrent < m_Aggregate->Count())
        {
            strRet = m_Aggregate->Pop(m_nCurrent);
        }
        return strRet;
    }
    QString GetCur()
    {
        return m_Aggregate->Pop(m_nCurrent);
    }
    bool IsEnd()
    {
        return ((m_nCurrent >= m_Aggregate->Count()) ? true : false);
    }
private:
    Aggregate*         m_Aggregate;
    int                m_nCurrent;
};

class Bookcase : public Aggregate
{
public:
    Bookcase() 
        :m_pIterator(nullptr)
    {
        m_bookVec.clear();
    }
    ~Bookcase()
    {
        if (nullptr != m_pIterator)
        {
            delete m_pIterator;
            m_pIterator = nullptr;
        }
    }
    Iterator* CreateIterator()
    {
        if (nullptr == m_pIterator)
        {
            m_pIterator = new BookIterator(this);
        }
        return m_pIterator;
    }
    int Count()
    {
        return m_bookVec.count();
    }
    void Push(const QString& strValue)
    {
        m_bookVec.push_back(strValue);
    }
    QString Pop(int nIndex)
    {
        QString bookStr;
        if (nIndex < Count())
        {
            bookStr = m_bookVec[nIndex];
        }
        return bookStr;
    }
private:
    QVector<QString>    m_bookVec;
    Iterator            *m_pIterator;
};

#if 1

#define FREE_OBJ(obj)        if (nullptr != (obj)){delete (obj); (obj) = nullptr;}

void main()
{
    Bookcase* bookcase = new Bookcase();
    bookcase->Push("SanGuoYanYi");
    bookcase->Push("ShuiHuZhuan");
    bookcase->Push("XiYouJi");

    Iterator* iter = bookcase->CreateIterator();
    if (nullptr != iter)
    {
        while (!iter->IsEnd())
        {
            qDebug() << iter->GetCur();
            iter->Next();
        }
    }

    FREE_OBJ(bookcase);
}

#endif // 1

#endif // !ITERATOR_H

 

标签:迭代,Iterator,virtual,模式,pIterator,Aggregate,QString
来源: https://www.cnblogs.com/yuemw/p/10387465.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有