首頁 >後端開發 >C#.Net教程 >C++設計模式淺識迭代器模式

C++設計模式淺識迭代器模式

黄舟
黄舟原創
2017-01-18 14:51:361415瀏覽

迭代器模式:提供一中方法順序存取一個聚合物件中的各個元素,而又不暴露該物件的內部表示。 【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++設計模式淺識迭代器模式的內容,更多相關內容請關注PHP中文網(www.php.cn)!


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn