美文网首页
设计模式-行为模式-迭代器模式

设计模式-行为模式-迭代器模式

作者: 阿棍儿_Leon | 来源:发表于2020-04-29 20:05 被阅读0次

    迭代器模式用于解决顺序访问聚合对象问题。C++的容器与迭代器就是典型的实现。

    以下代码定义了一个单向链表节点。

    #include <iostream>
    
    using namespace std;
    
    class Node
    {
    public:
        Node(int val):value(val),Next(nullptr){}
        class Node* Next;
        int value;
    };
    

    以下代码定义了迭代器以及它的基本迭代功能。

    class Iterator
    {
    public:
        virtual ~Iterator(){}
        virtual void First() = 0;
        virtual void Next() = 0;
        virtual Node* Current() = 0;
    };
    
    class NodeIterator:public Iterator
    {
    private:
        Node* CurrentPtr;
        class NodeContainer* nodeContainer;
    public:
        NodeIterator(class NodeContainer* container):nodeContainer(container),CurrentPtr(nullptr){}
        void First();
        void Next()
        {
            if (CurrentPtr)
            {
                CurrentPtr = CurrentPtr->Next;
            }
        }
        Node* Current()
        {
            return CurrentPtr;
        }
    };
    

    以下代码定义了容器以及它的基本修改功能。

    class Container
    {
    public:
        virtual ~Container(){}
        virtual Iterator* CreateIterator() = 0;
    };
    
    class NodeContainer:public Container
    {
    public:
        Node *Begin, *End;
        NodeContainer():Begin(nullptr),End(nullptr){}
        Iterator* CreateIterator()
        {
            return new NodeIterator(this);
        }
        void AddEnd(Node* node)
        {
            if (End != nullptr)
            {
                End->Next = node;
            }
            node->Next = nullptr;
            End = node;
            if (Begin == nullptr)
            {
                Begin = node;
            }
        }
        void RemoveBegin()
        {
            if (Begin != nullptr)
            {
                Node* Current = Begin;
                Begin = Begin->Next;
                delete Current;
            }
        }
    };
    
    void NodeIterator::First()
    {
        CurrentPtr = nodeContainer->Begin;
    }
    

    以下代码演示了迭代器模式。首先创建容器,对容器内容进行修改,然后创建迭代器,进行迭代访问。

    int main(void){
        NodeContainer container;
        for (int i = 0; i < 5; ++i)
        {
            Node* node = new Node(i);
            container.AddEnd(node);
        }
        for (int i = 0; i < 2; ++i)
        {
            container.RemoveBegin();
        }
        NodeIterator* pIt = dynamic_cast<NodeIterator*>(container.CreateIterator());
        pIt->First();
        if (pIt->Current() != nullptr)
        {
            cout<<"Begin->"<<pIt->Current()->value;
            pIt->Next();
        }
        for (; pIt->Current(); pIt->Next())
        {
            cout<<"->"<<pIt->Current()->value;
        }
        cout<<"->End"<<endl;
        return 0;
    }
    

    输出

    Begin->2->3->4->End
    

    相关文章

      网友评论

          本文标题:设计模式-行为模式-迭代器模式

          本文链接:https://www.haomeiwen.com/subject/vmvnwhtx.html