ホームページ  >  記事  >  バックエンド開発  >  C++ デザイン パターンのイテレータ パターンの簡単な紹介

C++ デザイン パターンのイテレータ パターンの簡単な紹介

黄舟
黄舟オリジナル
2017-01-18 14:51:361392ブラウズ

反復子パターン: オブジェクトの内部表現を公開せずに、集合オブジェクト内の各要素に順次アクセスするメソッドを提供します。 [DP]

4 つの役割:

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 中国語 Web サイト (www.php.cn) に注目してください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。