大话设计模式迭代器模式c++实现

迭代器模式

其他二十三种设计模式

#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;
}

猜你喜欢

转载自blog.csdn.net/wode_0828/article/details/114285486