《設計模式》學習筆記——迭代器模式
阿新 • • 發佈:2019-02-19
迭代器模式(Iterator Pattern)用於順序訪問集合物件的元素,不需要知道集合物件的底層表示。迭代器模式屬於行為型模式。
IteratorPattern.h
#pragma once #include<iostream> #include<string> // 模擬物件 typedef int Object; #define SIZE 5 // 自定義迭代器介面,抽象層 class MyIterator { public: virtual void First(void) = 0; // 指向第一個元素 virtual void Next(void) = 0; // 指向下一個元素 virtual bool IsDone(void) = 0; // 是否已經結束了 virtual Object CurrentItem(void) = 0; // 獲取當前項 private: protected: }; // 抽象容器,介面 class Aggregate { public: // 建立迭代器 virtual MyIterator* CreateIterator() = 0; // 獲取容器大小 virtual int getSize(void) = 0; // 獲取元素 virtual Object getItem(int index) = 0; private: protected: }; // 具體的迭代器 class ContreteIterator:public MyIterator { public: ContreteIterator(Aggregate* aggregate,int index=0):m_aggregate(aggregate),m_currentIndex(index){} virtual void First(void)// 指向第一個元素 { m_currentIndex = 0; // 當前遊標置0 } virtual void Next(void)// 指向下一個元素 { if (m_currentIndex < m_aggregate->getSize()) { m_currentIndex++; } } virtual bool IsDone(void)// 是否已經結束了 { return (m_currentIndex == m_aggregate->getSize()); } virtual Object CurrentItem(void)// 獲取當前項 { return m_aggregate->getItem(m_currentIndex); } private: int m_currentIndex; // 當前位置 Aggregate* m_aggregate; // 指向容器的指標 protected: }; // 具體的容器 class ContreteAggregate:public Aggregate { public: ContreteAggregate() { for (int i = 0; i < SIZE; i++) object[i] = i; } // 建立迭代器 virtual MyIterator* CreateIterator() { return new ContreteIterator(this); } // 獲取容器大小 virtual int getSize(void) { return SIZE; } // 獲取元素 virtual Object getItem(int index) { return object[index]; } private: Object object[SIZE]; // 對應的底層資料 protected: }; class IteratorPattern { public: IteratorPattern() {}; ~IteratorPattern() {}; };
IteratorPattern.cpp
#include "IteratorPattern.h"
mainTest.cpp
#include<iostream> #include<string> #include "IteratorPattern.h" int main(void) { // 建立一個集合 ContreteAggregate* contreteAggregate = new ContreteAggregate; // 建立一個迭代器 MyIterator* myIterator= contreteAggregate->CreateIterator(); for (;!(myIterator->IsDone()); myIterator->Next()) { std::cout<< myIterator->CurrentItem()<<" "<<std::endl; } delete myIterator; delete contreteAggregate; system("pause"); return 0; }