迭代器模式
其他二十三种设计模式
#include<iostream>
#include<vector>
#include<string>
using namespace std;
typedef string object;
class Iterator {
public:
virtual object First() = 0;
virtual object Next() = 0;
virtual bool IsDone() = 0;
virtual object CurrentItem() = 0;
};
class ConcreteIterator;
class Aggregate {
public:
virtual Iterator* CreatIterator() = 0;
virtual vector<object>* GetVector() = 0;
};
class ConcreteAggregate :public Aggregate {
public:
ConcreteAggregate();
~ConcreteAggregate();
virtual Iterator* CreatIterator();
virtual vector<object>* GetVector();
int Count();
object GetElement(int _index);
void SetElement(int _index, object _object);
private:
vector<object>* items;
};
class ConcreteIterator :public Iterator {
public:
ConcreteIterator(Aggregate* _aggregate);
virtual object First();
virtual object Next();
virtual bool IsDone();
virtual object CurrentItem();
private:
ConcreteAggregate* aggregate;
int current;
};
ConcreteIterator::ConcreteIterator(Aggregate* _aggregate) {
this->aggregate = (ConcreteAggregate*)_aggregate;
current = 0;
}
object ConcreteIterator::First() {
return aggregate->GetVector()->at(0);
}
object ConcreteIterator::Next() {
current++;
if (current < aggregate->GetVector()->size())
return aggregate->GetVector()->at(current);
}
bool ConcreteIterator::IsDone() {
return current >= aggregate->GetVector()->size() ? true : false;
}
object ConcreteIterator::CurrentItem() {
return aggregate->GetVector()->at(current);
}
ConcreteAggregate::ConcreteAggregate() {
items = new vector<object>;
}
ConcreteAggregate::~ConcreteAggregate() {
delete items;
}
Iterator* ConcreteAggregate::CreatIterator() {
Iterator* it = new ConcreteIterator(this);
return it;
}
int ConcreteAggregate::Count() {
return items->size();
}
vector<object>* ConcreteAggregate::GetVector() {
return items;
}
object ConcreteAggregate::GetElement(int _index) {
return items->at(_index);
}
void ConcreteAggregate::SetElement(int _index, object _object) {
items->at(_index) = _object;
}
void test1() {
ConcreteAggregate* a = new ConcreteAggregate();
a->GetVector()->push_back("大鸟");
a->GetVector()->push_back("小菜");
a->GetVector()->push_back("行李");
a->GetVector()->push_back("老外");
a->GetVector()->push_back("公交内部人员");
a->GetVector()->push_back("小偷");
Iterator* it = a->CreatIterator();
cout << "从前向后:" << endl;
while (!it->IsDone()) {
cout << it->CurrentItem() << "请买车票!" << endl;
it->Next();
}
delete it, a;
}
int main() {
test1();
return 0;
}