Eine kurze Einführung in das Iteratormuster in C++-Entwurfsmustern

黄舟
Freigeben: 2017-01-18 14:51:36
Original
1350 Leute haben es durchsucht

Iteratormuster: Bietet eine Methode für den sequentiellen Zugriff auf jedes Element in einem Aggregatobjekt, ohne die interne Darstellung des Objekts offenzulegen. [DP]

Vier Rollen:

Abstrakte Iteratorklasse: Wird zum Definieren abstrakter Methoden verwendet, z. B. zum Abrufen des Startobjekts, zum Abrufen des nächsten Objekts, zur Beurteilung, ob das Ende erreicht ist, zum aktuellen Objekt, usw., einheitliche Schnittstelle.

ConcreteIterator Konkrete Iteratorklasse: Erbt Iterator und implementiert Methoden wie ein bestimmtes Startobjekt und ein nächstes Objekt.

Abstrakte Aggregationsklasse: Erstellen Sie einen Iterator

ConcreteAggregate konkrete Aggregationsklasse

Anwendbare Anlässe:

Wenn Sie unabhängig davon auf ein Aggregatobjekt zugreifen müssen Diese Was ist das Objekt, es muss nur durchlaufen werden.

Wenn Sie die Sammlung auf mehrere Arten durchlaufen müssen, z. B. von vorne nach hinten oder von hinten nach vorne.

Bietet eine einheitliche Struktur zum Durchlaufen verschiedener Aggregationsstrukturen, z. B. Start, Nächster, ob enden soll und welches Element sich aktuell befindet.

Testfall:

[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;
}
Nach dem Login kopieren

Implementierung des Iteratormusters:

[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);
}
Nach dem Login kopieren

Zusammenfassung: Das Iteratormuster trennt das Durchlaufverhalten von Sammlungsobjekten und abstrahiert eine Iteration der Handlerklasse ist dafür verantwortlich, sodass die interne Struktur der Sammlung nicht offengelegt wird und externer Code transparent auf die Daten innerhalb der Sammlung zugreifen kann.

Das Obige ist der Inhalt einer kurzen Einführung in das Iteratormuster in C++-Entwurfsmustern. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!


Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!