C++设计模式:迭代器模式
一、源代码:
#include<iostream>
#include<memory>
#include<vector>
using namespace std;
class Iterator
{
public:
virtual bool hasNext(const vector<string>& names) = 0;
virtual string next(const vector<string>& names) = 0;
virtual ~Iterator() = default;
};
class Container
{
public:
virtual shared_ptr<Iterator> getIterator() = 0;
virtual ~Container() = default;
};
class NameIterator:public Iterator
{
public:
NameIterator()
{
_index = 0;
}
virtual bool hasNext(const vector<string>& names) override
{
if(names.empty())
return false;
else if(_index<names.size())
return true;
else
return false;
}
virtual string next(const vector<string>& names) override
{
if(this->hasNext(names))
return names[_index++];
else
return "";
}
private:
unsigned int _index;
};
class NameRepository:public Container
{
public:
NameRepository()
{
_names = {"Robert","John","Julie","Lora"};
}
virtual shared_ptr<Iterator> getIterator() override
{
return make_shared<NameIterator>();
}
vector<string> getReository()
{
return _names;
}
private:
vector<string> _names;
};
int main()
{
shared_ptr<NameRepository> namesRepository = make_shared<NameRepository>();
for(shared_ptr<Iterator> iter= namesRepository->getIterator();iter->hasNext(namesRepository->getReository());)
{
string name = iter->next(namesRepository->getReository());
cout<<"Names: "<<name<<endl;
}
}
二、运行结果:
三、点评:
C++中STL自带迭代器,利用范围for语句也可以达到效果,所以本篇实在很烂,把简单的操作复杂化,为了设计模式凑数,当作反面教材