软件领域中的设计模式的重要性不言而喻。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态。虽然知道这些特性的定义但是并没有做到真正的理解,这样特性有什么作用?用于什么场合中等等问题,带着疑问开始学习设计模式,主要参考《大话设计模式》和《设计模式:可复用面向对象软件的基础》两本书。
迭代器模式:提供一种方法顺序访问一个聚敛对象的各个元素,而又不暴露该对象的内部表示。
迭代器模式现在已经包含在语言中了,例如C++中的for_each和Java中的foreach in。
为遍历不同的聚集结构提供如开始,下一个,是否结束,当前一项等统一接口。
#include<iostream>
#include<vector>
using namespace std;
class MyIterator{
public:
MyIterator(){};
virtual ~MyIterator(){};
virtual int First()=0; // 返回集合第一个元素
virtual int Next()=0; // 返回集合下一个
virtual bool IsDone()=0; // 判断当前是不是集合尾部
virtual int CurrentItem()=0; // 返回集合当前元素
};
class Aggregate{
public:
virtual MyIterator* CreatIterator()=0;//创建一个迭代器
};
class ConcreteAggregate :public Aggregate
{
private:
vector<int> item;
MyIterator* p_Iterator;
public:
ConcreteAggregate() : p_Iterator(nullptr){}
MyIterator* CreatIterator();
int Count()
{
return item.size();
}
void Set(int value)
{
item.push_back(value);
}
int Get(int index)
{
return item[index];
}
};
class ConcreteIterator :public MyIterator
{
private:
ConcreteAggregate *aggregate;
int current = 0;
public:
ConcreteIterator(){};
~ConcreteIterator(){};
ConcreteIterator(ConcreteAggregate* aggregate)
{
this->aggregate = aggregate;
}
int First() override
{
return aggregate->Get(0);
}
int Next() override
{
int temp=0;
current++;
if (current < aggregate->Count())
{
temp=aggregate->Get(current);
}
return temp;
}
bool IsDone() override
{
if (current >= aggregate->Count())
return true;
else
return false;
}
int CurrentItem() override
{
return aggregate->Get(current);
}
};
MyIterator* ConcreteAggregate::CreatIterator()
{
p_Iterator= new ConcreteIterator(this);
return p_Iterator;
}
int main()
{
ConcreteAggregate* a = new ConcreteAggregate();
a->Set(0);
a->Set(1);
a->Set(2);
a->Set(3);
a->Set(4);
MyIterator* p_iter = a->CreatIterator();
int temp = p_iter->First();
cout << temp << endl;;
cout << a->Count() << endl;
cout << "遍历" << endl;
while (!p_iter->IsDone())
{
cout << p_iter->CurrentItem() << endl;
p_iter->Next();
}
delete a;
delete p_iter;
return 0;
}