>  기사  >  백엔드 개발  >  C++ 디자인 패턴의 반복자 패턴에 대한 간략한 소개

C++ 디자인 패턴의 반복자 패턴에 대한 간략한 소개

黄舟
黄舟원래의
2017-01-18 14:51:361408검색

반복자 패턴: 객체의 내부 표현을 노출하지 않고 집계 객체의 각 요소에 순차적으로 액세스하는 방법을 제공합니다. [DP]

네 가지 역할:

Iterator 추상 클래스: 시작 객체 가져오기, 다음 객체 가져오기, 끝에 도달했는지 판단, 현재 객체 가져오기 등 추상 메서드를 정의하는 데 사용됩니다. 등, 통합 인터페이스.

ConcreteIterator 구체적인 반복자 클래스: Iterator를 상속하고 특정 시작 개체, 다음 개체 등의 메서드를 구현합니다.

집계 집계 추상 클래스: 반복자 생성

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으로 문의하세요.