// 定义:提供一种方法顺序当问一个聚合对象中的各个元素,而不
// 暴露该对象的内部表示
//
// 模式举例:
//
// 模式特点:
//
//
#include<iostream>
#include<string>
#include<vector>
using namespace std;
//迭代器
class Iterator
{
public:
virtual string first()=0;
virtual string next()=0;
virtual string getCur()=0;
virtual bool isEnd()=0;
};
//pop肯定要是弹出元素啦!!!
//聚合对象
class Aggregate
{
public:
virtual void push(string s)=0;
virtual string pop(int pos)=0;
virtual string getValue(int pos)=0;
virtual int count()=0;
virtual Iterator * createIterator()=0;
};
class ConcreteIterator : public Iterator
{
public:
ConcreteIterator(Aggregate *a)
{
m_aggregate = a;
m_curPos = 0;
}
virtual string first()
{
return m_aggregate->getValue(0);
}
virtual string next()
{
m_curPos ++;
if(m_curPos < m_aggregate->count())
{
return m_aggregate->getValue(m_curPos);
}
else
{
return "";
}
}
virtual string getCur()
{
return m_aggregate->getValue(m_curPos);
}
virtual bool isEnd()
{
return m_curPos==m_aggregate->count();
}
private:
Aggregate * m_aggregate;
int m_curPos;
};
class ConcreteAggregate : public Aggregate
{
public:
ConcreteAggregate()
{
m_iter = NULL;
}
virtual void push(string s)
{
m_strvec.push_back(s);
}
virtual string pop(int pos)
{
string str = m_strvec[pos];
m_strvec.erase(pos);
return str;
}
virtual string getValue(int pos)
{
return m_strvec[pos];
}
virtual int count()
{
return m_strvec.size();
}
virtual Iterator * createIterator()
{
if(m_iter==NULL)
{
m_iter = new ConcreteIterator(this);
}
return m_iter;
}
private:
vector<string> m_strvec;
Iterator * m_iter;
};
int main()
{
Aggregate * pAggregate = new ConcreteAggregate();
Iterator * iter = pAggregate->createIterator();
pAggregate->push("test1");
pAggregate->push("test2");
pAggregate->push("test3");
while(!iter->isEnd())
{
cout<<iter->getCur()<<endl;
iter->next();
}
return 0;
}