23种设计模式C++源码与UML实现--迭代器模式
迭代器模式
Iterator模式也叫迭代模式,是行為模式之一,他把對容器種包含的內部對象的訪問委讓給外部類,使用Iterator按順序進行遍歷訪問的設計模式。
在使用Iterator模式之前,首先應該明白Iterator模式是用來解決什么問題的。或者說如果不使用Iterator模式會存在什么問題。
以上實現方法存在的問題:
方法1,容器承擔了太多的功能,一方面需要提供添加刪除等本身應有的功能,一方面還需要提供遍歷訪問功能。
方法2,旺旺容器實現遍歷的過程中,需要保存遍歷的狀態,當跟元素的添加刪除等功能夾雜在一起很容易引起混亂和程序運行錯誤等。
Iterator 模式就是為了有效地處理按順序進行遍歷訪問的一種設計模式,簡單地說 ,Iterator 模式提供一種有效的方法,可以屏蔽聚集對象集合的容器類的實現細節,而能對容器內包含的對象元素按順序進行有效的遍歷訪問。所以,Iterator 模式的應用場景可以歸納為滿足以下幾個條件:
- 訪問容器中包含的內部對象
- 按順序訪問
角色和職責:提供一種方法順序訪問一個聚斂對象的各個元素,而又不暴露該對象的內部表示。為遍歷不同的聚集結構提供如開始,下一個,是否結束,當前一項等統一接口。
Iterator(迭代器接口):
該接口必須定義實現迭代功能的最小定義方法集,比如提供 hasNext()和 next()方法。
ConcreteIterator(迭代器實現類):
迭代器接口 Iterator 的實現類。可以根據具體情況加以實現。
Aggregate(容器接口):
定義基本功能以及提供類似 Iterator iterator()的方法。
concreteAggregate(容器實現類):
容器接口的實現類。必須實現 Iterator iterator()方法。
說明:在迭代器中 持有 一個集合的 引用;所以通過迭代器,就可以訪問集合
// // Created by andrew on 2020/11/29. // #include <iostream>using namespace std;typedef int Object;#define SIZE 5class MyIterator { public:virtual ~MyIterator() = default;virtual void First() = 0;virtual void Next() = 0;virtual bool IsDone() = 0;virtual Object CurrentItem() = 0; };class Aggregate { public:virtual ~Aggregate() = default;virtual MyIterator *CreateIterator() = 0;virtual Object getItem(int index) = 0;virtual int getSize() = 0; }; // 進行迭代的地方 class ConcreteIterator : public MyIterator { public:ConcreteIterator(Aggregate *ag) {_ag = ag;_current_index = 0;}virtual void First() {_current_index = 0;}virtual void Next() {if(_current_index < _ag->getSize()){_current_index ++;}}virtual bool IsDone() {return (_current_index == _ag->getSize());}virtual Object CurrentItem() {return _ag->getItem(_current_index);}private:int _current_index;Aggregate *_ag; };// 存儲需要迭代的內容 class ConcreteAggregate : public Aggregate { public:ConcreteAggregate() {for(int i = 0; i < SIZE; i++) {object[i] = i + 100;}}MyIterator *CreateIterator() override{return new ConcreteIterator(this); // 讓迭代器持有一個集合的引用}Object getItem(int index) override {return object[index];}int getSize() override {return SIZE;} private:Object object[SIZE]; };int main(int argc, char *argv[]) {Aggregate *aggregate = new ConcreteAggregate;MyIterator *myIterator = aggregate->CreateIterator();for(; !(myIterator->IsDone()); myIterator->Next()) {cout << myIterator->CurrentItem() << " ";}delete myIterator;delete aggregate;cout << "iterator demo" << endl;return 0; }總結
以上是生活随笔為你收集整理的23种设计模式C++源码与UML实现--迭代器模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 作者:张家琳(1983-),女,中国科学
- 下一篇: 【项目管理】合同和采购