반복자 패턴: 객체의 내부 표현을 노출하지 않고 집계 객체의 각 요소에 순차적으로 액세스하는 방법을 제공합니다. [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)를 참고해주세요!