迭代器模式:提供一中方法順序訪問一個彙總對象中的各個元素,而又不暴露該對象的內部表示。【DP】
四個角色:
Iterator迭代器抽象類別: 用於定義得到開始對象,得到下一個對象、判斷是否到結尾、當前對象等抽象方法,統一介面。
ConcreteIterator具體迭代器類: 繼承Iterator,實現具體開始對象、下一個對象等方法。
Aggregate聚集抽象類別: 建立迭代器
ConcreteAggregate具體聚集類
適用場合:
當你需要訪問一個聚集對象,而且不管這些對象是什麼,只需要遍曆的時候。
需要對聚集有多種方式遍曆時,如從前至後或從後至前。
為遍曆不同的聚集結構提供如開始、下一個、是否結束、當前哪一項等統一的結構。
測試案例:
[code]int main(){ ConcreteAggregate pa; pa.Add("BigBird"); pa.Add("Pickles"); pa.Add("Luggage"); pa.Add("Foreigners"); pa.Add("InnerStaff"); pa.Add("Thief"); ConcreteIterator Itr(pa); string temp = Itr.First(); while (!Itr.IsDone()) { std::cout << Itr.currentItem() << ", ticket, Please\n"; Itr.Next(); } return 0;}
迭代器模式實現:
[code]//迭代器模式#include <iostream>#include <deque>#include <string>using std::string;using std::deque;//MyIterator迭代器抽象類別class MyIterator{public: MyIterator(){} //得到開始對象 virtual string First() = 0; //得到下一個對象 virtual string Next() = 0; //判斷是否到結尾 virtual bool IsDone() = 0; //當前對象 virtual string currentItem() = 0; };//抽象聚集類class Aggregate{public: Aggregate(){} //建立迭代器 virtual MyIterator* createIterator() = 0;private: friend class MyIterator;};//具體聚集類class ConcreteAggregate: public Aggregate{public: MyIterator* createIterator(); int Count(); void Add(string st); string This(int index);private: friend class ConcreteIterator; //乘客隊列 deque<string> passengers;};//具體的迭代器類class ConcreteIterator: public MyIterator{public: ConcreteIterator(ConcreteAggregate); string First(); string Next(); bool IsDone(); string currentItem();private: //以具體的聚集類為友元類 friend class ConcreteAggregate; ConcreteAggregate aggregate; int current = 0; };//方法實現//具體迭代器類ConcreteIterator::ConcreteIterator(ConcreteAggregate cAgg): aggregate(cAgg), current(cAgg.passengers.size() - 1){}string ConcreteIterator::First(){ return aggregate.This(0); }string ConcreteIterator::Next(){ string temp; --current; if(current >= 0) temp = aggregate.This(current); return temp;}string ConcreteIterator::currentItem(){ return aggregate.This(current);}bool ConcreteIterator::IsDone(){ return current >= 0 ? false : true;}//方法實現//具體聚集類MyIterator* ConcreteAggregate::createIterator(){ return (new ConcreteIterator(*this));}int ConcreteAggregate::Count(){ return passengers.size();}void ConcreteAggregate::Add(string st){ passengers.push_back(st);}string ConcreteAggregate::This(int index){ return passengers.at(index);}
總結:迭代器模式就是分離了集合對象的遍曆行為,抽象出一個迭代器類來負責,這樣既可以做到不暴露集合內部結構,又可讓外部代碼透明地訪問集合內部的資料。
以上就是C++設計模式淺識迭代器模式的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!