[行为型模式]迭代器模式的理解

[img]https://api5.yunpan.360.cn/intf.php?method=Share.getPublicThumbByNid&qid=108635719&nid=13770720612900372&size=800_600&devtype=web&v=1.0.1&rtick=14676146423468&share_qid=108635719&sign=e962522e86fff375be05a576c7aea5c3&[/img]
[img]https://api5.yunpan.360.cn/intf.php?method=Share.getPublicThumbByNid&qid=108635719&nid=14666498479405615&size=800_600&devtype=web&v=1.0.1&rtick=14666499174033&share_qid=108635719&sign=732dc65142f295ce7ef15a00ca56727c&[/img]

[img]https://api5.yunpan.360.cn/intf.php?method=Share.getPublicThumbByNid&qid=108635719&nid=14666498649460277&size=800_600&devtype=web&v=1.0.1&rtick=14666499172480&share_qid=108635719&sign=1c04ac218625b0c0ce76df9c01164786&[/img]

[color=red][b]头文件[/b][/color]

//IteratorPattern.h

#ifndef INTERATOR_PATTERN_H
#define INTERATOR_PATTERN_H

#include <Windows.h>
#include <iostream>
#include <vector>
using namespace std;

namespace IteratorPattern
{
template<class Item>
class Iterator
{
public:
virtual void First()=0;
virtual void Next()=0;
virtual Item* CurrentItem()=0;
virtual bool IsDone()=0;
virtual ~Iterator();
};

template<class Item>
class ConcreteAggregate;

template<class Item>
class ConcreteIterator : public Iterator <Item>
{
public:
ConcreteIterator(ConcreteAggregate<Item>* pAggr);
virtual void First();
virtual void Next();
virtual Item* CurrentItem();
virtual bool IsDone();

private:
ConcreteAggregate<Item>* m_pAggr;
int m_nCur;

};

template<class Item>
class Aggregate
{
public:
virtual Iterator<Item>* CreateIterator()=0;
virtual ~Aggregate();
};

template<class Item>
class ConcreteAggregate:public Aggregate<Item>
{
public:
ConcreteAggregate();
virtual Iterator<Item>* CreateIterator();
Item& operator[](int index);
int GetLen();

private:
vector<Item >m_Data;
};

//
void IteratorPattern_Test();
}

#endif


[color=red][b]实现[/b][/color]

#include "IteratorPattern.h"
#include <iostream>
using namespace std;

#define SAFE_DELETE(p) if (p) { delete p; p = NULL; }

namespace IteratorPattern
{
//
template<class Item>
Iterator<Item>::~Iterator(){}

template<class Item>
ConcreteIterator<Item>::ConcreteIterator(ConcreteAggregate<Item>*a)
: m_pAggr(a)
, m_nCur(0)
{}

template<class Item>
void ConcreteIterator<Item>::First()
{
m_nCur=0;
}

template<class Item>
void ConcreteIterator<Item>::Next()
{
if(m_nCur<m_pAggr->GetLen())
m_nCur++;
}

template<class Item>
Item* ConcreteIterator<Item>::CurrentItem()
{
if(m_nCur<m_pAggr->GetLen())
return &(*m_pAggr)[m_nCur];
else
return NULL;
}

template<class Item>
bool ConcreteIterator<Item>::IsDone()
{
return (m_nCur>=m_pAggr->GetLen());
}

//
template<class Item>
Aggregate<Item>::~Aggregate(){}

template<class Item>
ConcreteAggregate<Item>::ConcreteAggregate()
{
m_Data.push_back(1);
m_Data.push_back(2);
m_Data.push_back(3);
}

template<class Item>
Iterator<Item>* ConcreteAggregate<Item>::CreateIterator()
{
return new ConcreteIterator<Item>(this);
}

template<class Item>
Item& ConcreteAggregate<Item>::operator[](int index)
{
return m_Data[index];
}

template<class Item>
int ConcreteAggregate<Item>::GetLen()
{
return m_Data.size();
}

//
void IteratorPattern_Test()
{
Aggregate<int> * m_pAggr =new ConcreteAggregate<int>();
Iterator<int> *it=m_pAggr->CreateIterator();

for(it->First();!it->IsDone();it->Next())
{
cout<<*(it->CurrentItem())<<endl;
}

delete it;
delete m_pAggr;
}
}



1
2
3
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值