迭代器
提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示.
实例
main.cc:
#include <windows.h>
#include "runner_club.h"
#include "runner_iterator.h"
#include <iostream>
using namespace std;
/*
design_pattern:"iterator"
list all members of the runner club.
*/
int main(){
RunnerClub *runner_club = new RunnerClub();
runner_club->Append("zhang san");
runner_club->Append("li si");
runner_club->Append("wang wu");
Iterator *iterator = runner_club->CreateIterator();
for(;!iterator->IsEnd();iterator->Next()){
cout << iterator->GetCurrent() << endl;
}
//clear
delete runner_club;
system("Pause");
return ;
}
Club:
//club.h
#ifndef HELENDP_SOURCE_CLUB_H_
#define HELENDP_SOURCE_CLUB_H_
#include "iterator.h"
#include <string>
using namespace std;
class Club{
public:
Club();
virtual ~Club();
virtual int GetTotal() = ;
virtual void Append(string name) = ;
virtual string Gain(int index) = ;
virtual Iterator* CreateIterator() = ;
};
#endif
//club.cc
#include "club.h"
Club::Club(){
}
Club::~Club(){
}
RunnerClub:
//runner_club.h
#ifndef HELENDP_SOURCE_RUNNER_CLUB_H_
#define HELENDP_SOURCE_RUNNER_CLUB_H_
#include "club.h"
#include <vector>
using namespace std;
class RunnerClub : public Club{
public:
RunnerClub();
~RunnerClub();
int GetTotal();
void Append(string name);
string Gain(int index);
Iterator* CreateIterator();
private:
Iterator *iterator_;
vector<string> vector_;
};
#endif
//runner_club.cc
#include "runner_club.h"
#include "runner_iterator.h"
#include <stdio.h>
#include <iostream>
using namespace std;
RunnerClub::RunnerClub(){
iterator_ = NULL;
vector_.clear();
}
RunnerClub::~RunnerClub(){
if(!iterator_){
delete iterator_;
iterator_ = NULL;
}
}
int RunnerClub::GetTotal(){
return vector_.size();
}
void RunnerClub::Append(string name){
vector_.push_back(name);
}
string RunnerClub::Gain(int index){
return vector_[index % vector_.size()];
}
Iterator* RunnerClub::CreateIterator(){
iterator_ = new RunnerIterator(this);
return iterator_;
}
Iterator:
//iterator.h
#ifndef HELENDP_SOURCE_ITERATOR_H_
#define HELENDP_SOURCE_ITERATOR_H_
#include <string>
using namespace std;
class Iterator{
public:
Iterator();
virtual ~Iterator();
virtual string First() = ;
virtual string Next() = ;
virtual bool IsEnd() = ;
virtual string GetCurrent() = ;
};
#endif
//iterator.cc
#include "iterator.h"
Iterator::Iterator(){
}
Iterator::~Iterator(){
}
RunnerIterator:
//runner_iterator.h
#ifndef HELENDP_SOURCE_RUNNER_ITERATOR_H_
#define HELENDP_SOURCE_RUNNER_ITERATOR_H_
#include "iterator.h"
#include "club.h"
class RunnerIterator : public Iterator{
public:
RunnerIterator(Club* club);
~RunnerIterator();
string First();
string Next();
bool IsEnd();
string GetCurrent();
private:
int index_;
Club *club_;
};
#endif
//runner_iterator.cc
#include "runner_iterator.h"
RunnerIterator::RunnerIterator(Club* club)
:index_(){
club_ = club;
}
RunnerIterator::~RunnerIterator(){
}
string RunnerIterator::First(){
return club_->Gain();
}
string RunnerIterator::Next(){
index_ %= club_->GetTotal();
return club_->Gain(index_++);
}
string RunnerIterator::GetCurrent(){
return club_->Gain(index_);
}
bool RunnerIterator::IsEnd(){
return (index_ >= club_->GetTotal() ? true : false );
}
代码和UML图(EA)工程文件,最后会整理打包上传.
UML类图
结构
- Iterator(Iterator):迭代器定义访问和遍历元素的接口.
- ConcreteIterator(RunnerIterator):实现迭代器的类.
- Aggregate(Club):创建相应迭代器的接口.
- ConcreteAggregate(RunnerClub):实现相应迭代器类.
优点
- 访问一个聚合对象的内容而无需暴露它的内部表示.
- 简化了聚合的接口.
- 在同一个聚合上可以有多个遍历.
缺点
- 对于比较简单的遍历数据聚合,使用迭代器方式遍历较为繁琐.