天天看点

行为型模式-迭代器(iterator)

迭代器

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

实例

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(Iterator):迭代器定义访问和遍历元素的接口.
  • ConcreteIterator(RunnerIterator):实现迭代器的类.
  • Aggregate(Club):创建相应迭代器的接口.
  • ConcreteAggregate(RunnerClub):实现相应迭代器类.

优点

  • 访问一个聚合对象的内容而无需暴露它的内部表示.
  • 简化了聚合的接口.
  • 在同一个聚合上可以有多个遍历.

缺点

  • 对于比较简单的遍历数据聚合,使用迭代器方式遍历较为繁琐.

继续阅读