【C++設(shè)計模式】迭代器模式

/* 小魚號的代碼日志
 * 設(shè)計模式
 * 迭代器模式
 * 提供了統(tǒng)一的方法遍歷對象
 * 缺點:
 * 每個聚合對象都需要一個迭代器闯传,會生成多個迭代器
 * 實例:大學(xué)院系信息展示
 */

#include<iostream>
#include<list>
#include<vector>
#include<array>
using namespace std;

class Department
{
public:
    Department(string strName)
    {
        m_strName = strName;
    }
    string getName()
    {
        return m_strName;
    }
    void setName(string strName)
    {
        m_strName = strName;
    }
private:
    string m_strName;
};

class Iterator
{
public:
    virtual bool hasNext() = 0;
    virtual Department* next() = 0;
    virtual void remove() = 0;
};

//計算機(jī)學(xué)院迭代器
class ComputerCollegeIterator :public Iterator
{
public:
    ComputerCollegeIterator(vector<Department*> vDepartment)
    {
        m_pos = 0;
        m_vDepartment = vDepartment;
    }
public:
    bool hasNext()
    {
        if(m_pos >= m_vDepartment.size())
        {
            return false;
        }
        return true;
    }
    Department* next()
    {
        return m_vDepartment[m_pos++];
    }
    void remove()
    {

    }
private:
    int m_pos;
    //計算機(jī)學(xué)院是按照vector存放系
    vector<Department*> m_vDepartment;
};

//信息工程學(xué)院迭代器
class InfoCollegeIterator :public Iterator
{
public:
    InfoCollegeIterator(array<Department*,5> ADepartment)
    {
        m_pos = 0;
        m_ADepartment = ADepartment;
    }
public:
    bool hasNext()
    {
        if(m_pos >= m_ADepartment.size())
        {
            return false;
        }
        return true;
    }
    Department* next()
    {
        return m_ADepartment[m_pos++];
    }
    void remove()
    {

    }
private:
    int m_pos;
    //計算機(jī)學(xué)院是按照array存放系
    array<Department*,5> m_ADepartment;
};

class College
{
public:
    College(string name)
    {
        m_name = name;
    }
    string getName()
    {
        return m_name;
    }
    virtual void addDepartment(string name) = 0;
    virtual Iterator* creatorIterator() = 0;
protected:
    string m_name;
};

class ComputerCollege : public College
{
public:
    ComputerCollege(string name) :College(name)
    {
        addDepartment("Soft Department");
        addDepartment("Net Department");
        addDepartment("BigData Department");
    }
    void addDepartment(string name)
    {
        Department* part = new Department(name);
        m_vDepartment.push_back(part);
    }
    Iterator* creatorIterator()
    {
        return new ComputerCollegeIterator(m_vDepartment);
    }
private:
    vector<Department*> m_vDepartment;
};

class InfoCollege : public College
{
public:
    InfoCollege(string name):College(name)
    {
        m_index = 0;
        addDepartment("Info Department1");
        addDepartment("Info Department2");
        addDepartment("Info Department3");
        addDepartment("Info Department4");
        addDepartment("Info Department5");
    }
    void addDepartment(string name)
    {
        Department* part = new Department(name);
        m_ADepartment[m_index++] = part;
    }
    Iterator* creatorIterator()
    {
        return new InfoCollegeIterator(m_ADepartment);
    }
private:
    array<Department*,5> m_ADepartment;
    int m_index;
};

void printDepartment(Iterator* it)
{
    while(it->hasNext())
    {
        Department* partment = it->next();
        cout << partment->getName() << endl;
    }
}

void testIterator()
{
    vector<College*> collegeList;
    College* college = new ComputerCollege("computer");
    collegeList.push_back(college);
    college = new InfoCollege("infomation");
    collegeList.push_back(college);
    auto it = collegeList.begin();
    while(it != collegeList.end())
    {
        cout << "college name:" << (*it)->getName() << endl;
        cout << "college department:" << endl;
        printDepartment((*it)->creatorIterator());
        cout << "=====================" << endl;
        it++;
    }
}


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末牵囤,一起剝皮案震驚了整個濱河市卓起,隨后出現(xiàn)的幾起案子旅择,更是在濱河造成了極大的恐慌沽一,老刑警劉巖秘案,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異莫鸭,居然都是意外死亡闹丐,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門被因,熙熙樓的掌柜王于貴愁眉苦臉地迎上來卿拴,“玉大人滥玷,你說我怎么就攤上這事∥±猓” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵蛋欣,是天一觀的道長航徙。 經(jīng)常有香客問我,道長陷虎,這世上最難降的妖魔是什么到踏? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮尚猿,結(jié)果婚禮上窝稿,老公的妹妹穿的比我還像新娘。我一直安慰自己凿掂,他們只是感情好伴榔,可當(dāng)我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著庄萎,像睡著了一般踪少。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上糠涛,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天援奢,我揣著相機(jī)與錄音,去河邊找鬼忍捡。 笑死集漾,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的砸脊。 我是一名探鬼主播具篇,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼凌埂!你這毒婦竟也來了栽连?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤侨舆,失蹤者是張志新(化名)和其女友劉穎秒紧,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挨下,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡熔恢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了臭笆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叙淌。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡秤掌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鹰霍,到底是詐尸還是另有隱情闻鉴,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布茂洒,位于F島的核電站孟岛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏督勺。R本人自食惡果不足惜渠羞,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望智哀。 院中可真熱鬧次询,春花似錦、人聲如沸瓷叫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽摹菠。三九已至雌芽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間辨嗽,已是汗流浹背世落。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留糟需,地道東北人屉佳。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像洲押,于是被迫代替她去往敵國和親武花。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,527評論 2 349