C++設計模式-迭代器模式

迭代器模式

  • 迭代器模式:提供一種方法順序訪問一個聚合對象中的各種元素,而又不暴露該對象的內部表示。

  • 適用性:

    • 訪問一個聚合對象的內容而無需暴露它的內部表示
    • 支持對聚合對象的多種遍歷
    • 爲遍歷不同的聚合結構提供一個統一的接口
  • 角色:

    • Iterator(迭代器):迭代器定義訪問和遍歷元素的接口

    • ConcreteIterator (具體迭代器):具體迭代器實現迭代器接口

      對該聚合遍歷時跟蹤當前位置

    • Aggregate (聚合):聚合定義創建相應迭代器對象的接口

    • ConcreteAggregate (具體聚合):具體聚合實現創建相應迭代器的接口,該操作返回ConcreteIterator的一個適當的實例

  • 代碼:

    #include <iostream>
    #include <string>
    #include <vector>
    
    using namespace std;
    
    
    class Iterator
    {
    public:
        Iterator(){};
        virtual ~Iterator(){};
        virtual string First() = 0;
        virtual string Next() = 0;
        virtual string GetCur() = 0;
        virtual bool IsEnd() = 0;
    };
    
    class Aggregate
    {
    public:
        virtual int Count() = 0;
        virtual void Push(const string& strValue)=0;
        virtual string Pop(const int nIndex)=0;
        virtual Iterator* CreateIterator() = 0;
    };
    
    class ConcreteIterator : public Iterator
    {
    public:
        ConcreteIterator(Aggregate* pAggregate):m_nCurrent(0),Iterator()
        {
            m_Aggregate = pAggregate;
        }
        string First()
        {
            return m_Aggregate->Pop(0);
        }
        string Next()
        {
            string strRet;
            m_nCurrent++;
            if(m_nCurrent < m_Aggregate->Count())
            {
                strRet = m_Aggregate->Pop(m_nCurrent);
            }
            return strRet;
        }
        string 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 ConcreteAggregate : public Aggregate
    {
    public:
        ConcreteAggregate():m_pIterator(NULL)
        {
            m_vecItems.clear();
        }
        ~ConcreteAggregate()
        {
            if(NULL != m_pIterator)
            {
                delete m_pIterator;
                m_pIterator = NULL;
            }
        }
        Iterator* CreateIterator()
        {
            if(NULL == m_pIterator)
            {
                m_pIterator = new ConcreteIterator(this);
            }
            return m_pIterator;
        }
        int Count()
        {
            return m_vecItems.size();
        }
        void Push(const string& strValue)
        {
            m_vecItems.push_back(strValue);
        }
        string Pop(const int nIndex)
        {
            string strRet;
            if(nIndex < Count())
            {
                strRet = m_vecItems[nIndex];
            }
            return strRet;
        }
    private:
        vector<string> m_vecItems;
        Iterator* m_pIterator;
    
    
    };
    
    int main()
    {
        ConcreteAggregate* pName = NULL;
        pName = new ConcreteAggregate();
        if(NULL != pName)
        {
            pName->Push("hello");
            pName->Push("word");
            pName->Push("cxue");
        }
        Iterator* iter = NULL;
        iter = pName->CreateIterator();
        if(NULL != iter)
        {
            string strItem = iter->First();
            while(!iter->IsEnd())
            {
                cout << iter->GetCur() << " is ok" << endl;
                iter->Next();
            }
        }
        system("pause");
    
        return 0;
    }
    

    參考博客:https://www.cnblogs.com/onlycxue/archive/2013/12/25/3490738.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章