Iterator模式

Iterator模式

一.意图

提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。

二.适用性

1.  访问一个聚合对象的内容而无需暴露它的内部表示

2.  支持对聚合对象的多种遍历

3.  为遍历不同聚合结构提供一个统一的接口(即支持多态迭代)。

三.结构


四.代码

Iterator类

H文件

#ifndef ITERATOR_H
#define ITERATOR_H

//迭代器接口类
class CIterator
{
public:
    virtual void First(){}
    virtual void Next(){}
    virtual bool IsDone(){}
    virtual void* CurrentItem(){}
};

#endif // ITERATOR_H


ConcreteIteator类

H文件

#ifndef CONCRETEITEATOR_H
#define CONCRETEITEATOR_H
#include "ConcreteAggregate.h"
class CConcreteAggregate;
//迭代器接口实现类
class CConcreteIterator : public CIterator
{
public:
    //将容器实现类传入
    CConcreteIterator(CConcreteAggregate* conAgg);
    //设置第一个
    void First();
    //判断是否最后一个
    bool IsDone();
    //下一个
    void Next();
    //获取容器index的实例
    void* CurrentItem();

private:
    CConcreteAggregate* m_concreteAggregate;
    int m_index = 0;
};

#endif // CONCRETEITEATOR_H

CPP文件

#include "ConcreteIteator.h"

CConcreteIterator::CConcreteIterator(CConcreteAggregate* conAgg)
{
    m_concreteAggregate = conAgg;
}

void CConcreteIterator::First()
{
    m_index = 0;
}

bool CConcreteIterator::IsDone()
{
    if(m_index < m_concreteAggregate->GetLength())
    {
        return true;
    }
    else
    {
        return false;
    }
}

void CConcreteIterator::Next()
{
    if(m_index < m_concreteAggregate->GetLength())
    {
        m_index++;
    }
}

void* CConcreteIterator::CurrentItem()
{
    if(m_index < m_concreteAggregate->GetLength())
    {
        return m_concreteAggregate->GetIndex(m_index);
    }
    else
    {
        return NULL;
    }
}


ConcreteAggregate类

H文件

#ifndef CONCRETEAGGREGATE_H
#define CONCRETEAGGREGATE_H
#include "Iterator.h"
#include "ConcreteIteator.h"
#include <vector>
#include <string>
using namespace std;
//容器接口
class CAggregate
{
public:
    virtual CIterator* CreateIterator(){}
};
//容器存放数据
class CBook
{
public:
    CBook(string name)
    {
        this->m_name = name;
    }

    string GetName()
    {
        return m_name;
    }
private:
    string m_name="";
};
//容器接口实现类
class CConcreteAggregate : public CAggregate
{
public:
    CConcreteAggregate();
    //根据index获取数据
    CBook* GetIndex(int index);
    //添加数据
    void AppandBook(CBook* book);
    //获取容器中数据个数
    int GetLength();
    //获取迭代器对象
    virtual CIterator* CreateIterator();

private:
    vector<CBook*> m_pBook;
};

#endif // CONCRETEAGGREGATE_H

CPP文件

#include "ConcreteAggregate.h"

CConcreteAggregate::CConcreteAggregate()
{
}

CBook* CConcreteAggregate::GetIndex(int index)
{
    if(index >= m_pBook.size())
    {
        return NULL;
    }
    else
    {
        return m_pBook[index];
    }
}

void CConcreteAggregate::AppandBook(CBook* book)
{
    m_pBook.push_back(book);
}
int CConcreteAggregate::GetLength()
{
    return m_pBook.size();
}
CIterator* CConcreteAggregate::CreateIterator()
{
    return new CConcreteIterator(this);
}

Main文件

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <math.h>

#include "ConcreteAggregate.h"
#include "ConcreteIteator.h"

using namespace std;
//Iterator mode
//迭代器设计模式的总体思想就是“在容器实现类中实现对实体的增删改查操作,而在迭代器实现类中实现遍历操作
int main()
{
    cout << "Hello World!" << endl;

    //容器类
    CConcreteAggregate* aggregate = new CConcreteAggregate();
    aggregate->AppandBook(new CBook("Book 1"));
    aggregate->AppandBook(new CBook("Book 2"));
    aggregate->AppandBook(new CBook("Book 3"));
    aggregate->AppandBook(new CBook("Book 4"));
    aggregate->AppandBook(new CBook("Book 5"));

    //获取迭代器
    CIterator* it = aggregate->CreateIterator();
    for(it->First(); it->IsDone(); it->Next())
    {
        CBook* book = (CBook*)it->CurrentItem();
        cout << book->GetName() << endl;
    }

    if(it != NULL)
    {
        delete it;
        it = NULL;
    }
    if(aggregate != NULL)
    {
        delete aggregate;
        aggregate = NULL;
    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值