設計模式學習筆記--迭代器模式

來源:互聯網
上載者:User

標籤:

一.簡介
今天學習一下設計模式中的迭代器模式,迭代器模式是一種非常非常常用的設計模式,以至於太有用了,C#,Java都將其作為內建實現,C++也提供了STL的迭代器,我們每天都在用,卻反倒感覺迭代器模式沒那麼重要了。畢竟我們自己實現的迭代器還是比不上語言原生提供的實現,但是為了學習,我們還是要看一下迭代器模式的實現,只有瞭解了原理,才能更好地使用。我們很多時候都是在處理一組對象,相對的,我們就需要相應的管理容器類來儲存物件,.我們需要Add,Remove等方法,但是我們還需要相應的方法來訪問容器內的對象。比如獲得首個對象First,尾部對象End,下一個對象Next等等方法。如果我們把這些方法都放在容器內實現的話,容器的職責就過重了,而且迭代的方式有所不同,比如我們需要從前向後迭代或者從後向前迭代,我們就可以直接通過更換迭代器來達到不同的效果。通過將迭代部分的內容抽離,我們就可以獲得更加靈活的對象訪問形式。下面我們來看一下迭代器模式的定義以及UML類圖:迭代器模式(Iterator Pattern):提供一種方法來訪問彙總對象,而不用暴露這個對象的內部表示,其別名為遊標(Cursor)。迭代器模式是一種對象行為型模式。

分析一下UML圖,我們的容器類就相當於Aggregate,提供一些抽象的容器方法,抽象迭代器類定義了一些迭代方法,比如獲得首尾元素,下個元素,當前元素等等,但是具體的迭代方式是通過ConcreteIterator實現的。具體容器類ConcreteAggregate類作為迭代器工廠,可以建立一個本容器對應的迭代器。
二.迭代器模式的例子我們直接看一下迭代器模式的例子:
// Design Pattern.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include <iostream>#include <string>#include <vector>#include <map>using namespace std;//迭代器基類class Iterator{public://迭代器向後指向一個virtual void Next() = 0;//迭代器指向首元素virtual void Begin() = 0;//迭代器是否指向容器末尾virtual bool IsEnd() = 0;//返回當前迭代器所指元素virtual string GetCurrent() = 0;};//容器基類class VecterBase{public://添加元素virtual void Add(string elem) = 0;//獲得當前元素virtual string Get(int index) = 0;//獲得容器當前容量virtual int Count() = 0;//迭代器工廠virtual Iterator* CreateIterator() = 0;};//具體迭代器類class ConcreteIterator : public Iterator{private:int m_currentIndex;VecterBase* m_vec;public:ConcreteIterator(VecterBase* vec):m_vec(vec),m_currentIndex(0){}virtual void Next() override{m_currentIndex++;}virtual void Begin(){m_currentIndex = 0;}virtual bool IsEnd(){return m_currentIndex >= m_vec->Count();}virtual string GetCurrent(){return m_vec->Get(m_currentIndex);}};//具體容器類class ConcreteVector : public VecterBase{private:vector<string> stringvec;public:void Add(string elem){stringvec.push_back(elem);}string Get(int index){return stringvec[index];}int Count(){return stringvec.size();}Iterator* CreateIterator(){return new ConcreteIterator(this);}};int _tmain(int argc, TCHAR* argv[]){VecterBase* vec = new ConcreteVector();vec->Add("張三");vec->Add("李四");vec->Add("王二麻子");Iterator* it = vec->CreateIterator();for (it->Begin(); !it->IsEnd(); it->Next()){cout << it->GetCurrent() << endl;}//是不是很像STL裡面的迭代器呢?/*for (std::vector<string>::iterator it = vec.begin(); it != vec.end(); ++it){cout << (*it) << endl;}*/system("pause");return 0;}
結果:張三
李四
王二麻子
請按任意鍵繼續. . .
我們簡單來看一下迭代器,我這裡寫了一段STL的迭代器代碼作為對比,我們的迭代器用法與STL的基本相同。首先建立一個迭代器,初值為容器首元素位置,然後進行迭代,直到到達尾元素為止。每次迭代向後移動一個元素。

三.迭代器模式的總結
最後,我們來看一下迭代器模式的優點,缺點以及使用時機:優點:1)迭代器簡化了容器類,實現了單一職責原則。將遍曆和儲存功能分離,不論是新增容器類型還是新增迭代器都符合開放-封閉原則。2)可以提供多種迭代方式,比如新增一個從後向前迭代的迭代器等。
缺點:1)迭代器的設計比較難,很難抽象出一套比較完整的迭代器基類。2)迭代器使系統類別個數增加,一定程度上難以理解。
使用時機:1)訪問一個彙總對象的內容而無須暴露它的內部表示。將彙總對象的訪問與內部資料的儲存分離,使得訪問彙總對象時無須瞭解其內部實現細節。
2)   需要為一個彙總對象提供多種遍曆方式。
3)   為遍曆不同的彙總結構提供一個統一的介面,在該介面的實作類別中為不同的彙總結構提供不同的遍曆方式,而用戶端可以一致性地操作該介面。

最後,順帶提一句,迭代器模式太有用了,以至於語言或者基礎庫都提供了完整的迭代器實現,反倒這個模式我們自己實現的意義不大了....

設計模式學習筆記--迭代器模式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.