?? Iterator模式也叫迭代模式,是行為模式之一拾弃,它把對(duì)容器中包含的內(nèi)部對(duì)象的訪問委讓給外部類值桩,使用Iterator(遍歷)按順序進(jìn)行遍歷訪問的設(shè)計(jì)模式。
?? 在應(yīng)用Iterator模式之前豪椿,首先應(yīng)該明白Iterator模式用來解決什么問題奔坟⌒埃或者說,如果不使用Iterator模式咳秉,會(huì)存在什么問題婉支。
?? 1.由容器自己實(shí)現(xiàn)順序遍歷。直接在容器類里直接添加順序遍歷方法
?? 2.讓調(diào)用者自己實(shí)現(xiàn)遍歷滴某。直接暴露數(shù)據(jù)細(xì)節(jié)給外部磅摹。
以上方法1與方法2都可以實(shí)現(xiàn)對(duì)遍歷,這樣有問題呢霎奢?
?? 1.容器類承擔(dān)了太多功能:一方面需要提供添加刪除等本身應(yīng)有的功能;一方面還需要提供遍歷訪問功能饼灿。
?? 2.往往容器在實(shí)現(xiàn)遍歷的過程中幕侠,需要保存遍歷狀態(tài),當(dāng)跟元素的添加刪除等功能夾雜在一起碍彭,很容易引起混亂和程序運(yùn)行錯(cuò)誤等晤硕。
?? Iterator模式就是為了有效地處理按順序進(jìn)行遍歷訪問的一種設(shè)計(jì)模式,簡(jiǎn)單地說庇忌,Iterator模式提供一種有效的方法舞箍,可以屏蔽聚集對(duì)象集合的容器類的實(shí)現(xiàn)細(xì)節(jié),而能對(duì)容器內(nèi)包含的對(duì)象元素按順序進(jìn)行有效的遍歷訪問皆疹。所以疏橄,Iterator模式的應(yīng)用場(chǎng)景可以歸納為滿足以下幾個(gè)條件:
- 訪問容器中包含的內(nèi)部對(duì)象
- 按順序訪問
角色和職責(zé)
迭代器角色(Iterator):迭代器角色負(fù)責(zé)定義訪問和遍歷元素的接口。
具體迭代器角色(Concrete Iterator):具體迭代器角色要實(shí)現(xiàn)迭代器接口略就,并要記錄遍歷中的當(dāng)前位置捎迫。
集合角色(Aggregate):集合角色負(fù)責(zé)提供創(chuàng)建具體迭代器角色的接口宣脉。
具體集合角色(Concrete Aggregate):具體集合角色實(shí)現(xiàn)創(chuàng)建具體迭代器角色的接口——這個(gè)具體迭代器角色于該集合的結(jié)構(gòu)相關(guān)嵌言。
案例
typedef int Object;
class Iterator
{
public:
virtual void first() = 0;
virtual void next() = 0;
virtual bool isDone() = 0;
virtual Object currentItem() = 0;
virtual ~Iterator(){}
};
class Aggregate
{
public:
virtual Object getItem(int index) = 0;
virtual Iterator* createIterator() = 0;
virtual int getSize() = 0;
virtual ~Aggregate(){};
};
class ContreteIterator : public Iterator
{
public:
ContreteIterator(Aggregate *ag)
{
_ag = ag;
_idx = 0;
}
~ ContreteIterator()
{
_ag = NULL;
_idx = 0;
}
virtual void first()
{
_idx = 0;
}
virtual void next()
{
if(_idx < _ag->getSize())
{
_idx++;
}
}
virtual bool isDone()
{
return (_idx == _ag->getSize());
}
virtual Object currentItem()
{
return _ag->getItem(_idx);
}
private:
Aggregate *_ag;
int _idx;
};
class ContreteAggregate : public Aggregate
{
public:
enum {SIZE = 5};
ContreteAggregate()
{
for(int i = 0; i < SIZE; i++)
{
object[i] = i + 1;
}
}
~ContreteAggregate()
{
}
virtual Object getItem(int index)
{
return object[index];
}
virtual Iterator* createIterator()
{
return new ContreteIterator(this);
}
virtual int getSize()
{
return SIZE;
}
private:
Object object[SIZE];
};
int main()
{
// 創(chuàng)建一個(gè)集合
Aggregate *ag = new ContreteAggregate();
// 創(chuàng)建一個(gè)遍歷這個(gè)集合的 迭代器
Iterator *it = ag->createIterator();
//通過迭代器 遍歷 集合
for (; !(it->isDone()); it->next() )
{
cout << it->currentItem() << " ";
}
//清理相關(guān)資源
delete it;
delete ag;
}
實(shí)現(xiàn)要點(diǎn):
1.迭代抽象:訪問一個(gè)聚合對(duì)象的內(nèi)容而無需暴露它的內(nèi)部表示。
2.迭代多態(tài):為遍歷不同的集合結(jié)構(gòu)提供一個(gè)統(tǒng)一的接口成洗,從而支持同樣的算法在不同的集合結(jié)構(gòu)上進(jìn)行操作崔兴。
3.迭代器的健壯性考慮:遍歷的同時(shí)更改迭代器所在的集合結(jié)構(gòu)彰导,會(huì)導(dǎo)致問題。
適用性:
1.訪問一個(gè)聚合對(duì)象的內(nèi)容而無需暴露它的內(nèi)部表示敲茄。
2.支持對(duì)聚合對(duì)象的多種遍歷位谋。
3.為遍歷不同的聚合結(jié)構(gòu)提供一個(gè)統(tǒng)一的接口(即, 支持多態(tài)迭代)。