1. 程式人生 > >設計模式-迭代器模式 C++實現

設計模式-迭代器模式 C++實現

一個聚合物件,如一個列表(List)或者一個集合(Set),應該提供一種方法來讓別人可以訪問它的元素,而又不需要暴露它的內部結構。
針對不同的需要,可能還要以不同的方式遍歷整個聚合物件,但是我們並不希望在聚合物件的抽象層介面中充斥著各種不同遍歷的操作。
怎樣遍歷一個聚合物件,又不需要了解聚合物件的內部結構,還能夠提供多種不同的遍歷方式,這就是迭代器模式所要解決的問題。

1.模式定義

迭代器模式(Iterator Pattern) :提供一種方法來訪問聚合物件,而不用暴露這個物件的內部表示,其別名為遊標(Cursor)。迭代器模式是一種物件行為型模式。

2.模式結構

迭代器模式包含如下角色:

Iterator: 抽象迭代器
ConcreteIterator: 具體迭代器
Aggregate: 抽象聚合類
ConcreteAggregate: 具體聚合類

這裡寫圖片描述

3.程式碼分析

Iterator.h

template<class Item>

class Iterator
{
public:
    Iterator() {};
    virtual ~Iterator() {};

    virtual void first() = 0;
    virtual void next() = 0;
    virtual Item *curItem() = 0;
    virtual
bool isDone() = 0; };

ConcreteIterator.h

#pragma once
#include "Iterator.h"

template<class Item>

class ConcreteIterator : public Iterator <Item>
{
public:
    ConcreteIterator(Aggregate<Item> *a) :aggr(a), cur(0) {};
    virtual ~ConcreteIterator() {};

    virtual void first();
    virtual
void next(); virtual Item *curItem(); virtual bool isDone(); private: Aggregate<Item> *aggr; int cur; }; template<class Item> void ConcreteIterator<Item>::first() { cur = 0; } template<class Item> void ConcreteIterator<Item>::next() { if (cur < aggr->getSize()) cur++; } template<class Item> Item *ConcreteIterator<Item>::curItem() { if (cur < aggr->getSize()) { return &(*aggr)[cur]; } else { return NULL; } } template<class Item> bool ConcreteIterator<Item>::isDone() { return cur >= aggr->getSize(); }

Aggregate.h

#pragma once
#include "Iterator.h"

template<class Item>
class Aggregate{
public:
    Aggregate() {};
    virtual ~Aggregate() {};

    virtual void pushData(Item item) = 0;
    virtual Iterator<Item>* createIterator() = 0;
    virtual Item& operator[](int index) = 0;
    virtual int getSize() = 0;
};                                                                                                                                                     

ConcreteAggregate.h

#pragma once
#include <vector>
#include "Aggregate.h"
#include "ConcreteIterator.h"

using namespace std;

template <class Item>
class ConcreteAggregate : public Aggregate<Item>
{
public:
    ConcreteAggregate() {};
    virtual ~ConcreteAggregate() {};

    virtual void pushData(Item item);
    virtual Iterator<Item>* createIterator();
    virtual Item& operator[](int index);
    virtual int getSize();
private:
    vector<Item> data;
};

template <class Item>
void ConcreteAggregate<Item>::pushData(Item item)
{
    data.push_back(item);
}

template <class Item>
Iterator<Item>* ConcreteAggregate<Item>::createIterator()
{
    return new ConcreteIterator<Item>(this);
}

template <class Item>
Item& ConcreteAggregate<Item>::operator[](int index)
{
    return data[index];
}

template <class Item>
int ConcreteAggregate<Item>::getSize()
{
    return data.size();
}

測試程式碼:

int main(int argc, char *argv[])
{

    Aggregate<int> * aggr = new ConcreteAggregate<int>();
    aggr->pushData(3);
    aggr->pushData(2);
    aggr->pushData(1);
    Iterator<int> * it = aggr->createIterator();

    for (it->first(); !it->isDone(); it->next())
    {
        std::cout << *it->curItem() << std::endl;
    }
    delete it;
    delete aggr;
}

這裡寫圖片描述

4.模式優點

簡化了遍歷方式,對於物件集合的遍歷,還是比較麻煩的,對於陣列或者有序列表,我們尚可以通過遊標來取得,但使用者需要在對集合瞭解很清楚的前提下,自行遍歷物件,但是對於hash表來說,使用者遍歷起來就比較麻煩了。而引入了迭代器方法後,使用者用起來就簡單的多了。
可以提供多種遍歷方式,比如說對有序列表,我們可以根據需要提供正序遍歷,倒序遍歷兩種迭代器,使用者用起來只需要得到我們實現好的迭代器,就可以方便的對集合進行遍歷了。
封裝性良好,使用者只需要得到迭代器就可以遍歷,而對於遍歷演算法則不用去關心。

5.模式缺點

對於比較簡單的遍歷(像陣列或者有序列表),使用迭代器方式遍歷較為繁瑣,大家可能都有感覺,像ArrayList,我們寧可願意使用for迴圈和get方法來遍歷集合。

6.總結

迭代器模式是與集合共生共死的,一般來說,我們只要實現一個集合,就需要同時提供這個集合的迭代器,就像java中的Collection,List、Set、Map等,這些集合都有自己的迭代器。假如我們要實現一個這樣的新的容器,當然也需要引入迭代器模式,給我們的容器實現一個迭代器。

但是,由於容器與迭代器的關係太密切了,所以大多數語言在實現容器的時候都給提供了迭代器,並且這些語言提供的容器和迭代器在絕大多數情況下就可以滿足我們的需要,所以現在需要我們自己去實踐迭代器模式的場景還是比較少見的,我們只需要使用語言中已有的容器和迭代器就可以了。

相關推薦

設計模式-模式 C++實現

一個聚合物件,如一個列表(List)或者一個集合(Set),應該提供一種方法來讓別人可以訪問它的元素,而又不需要暴露它的內部結構。 針對不同的需要,可能還要以不同的方式遍歷整個聚合物件,但是我們並不希望在聚合物件的抽象層介面中充斥著各種不同遍歷的操作。 怎樣

設計模式---模式(C++實現)

迭代器模式(Iterator Pattern)用於順序訪問集合物件的元素,不需要知道集合物件的底層表示。 意圖 提供一種方法順序訪問一個聚合 物件中各個元素,而又無需暴露該物件的內部表示。 解

重走Java設計模式——模式(Iterator Pattern)

迭代器模式 定義 提供一種方法順序訪問一個聚合物件中各個元素, 而又無須暴露該物件的內部表示。 模式結構 1.抽象容器:一般是一個介面,提供一個iterator()方法,例如java中的Collection介面,List介面,Set介面等。 2.具體

設計模式 | 模式及典型應用

本文的主要內容: 介紹迭代器模式 原始碼分析迭代器模式的典型應用 Java集合中的迭代器模式 Mybatis中的迭代器模式 更多內容可訪問我的個人部落格:laijianfeng.org 關注【小旋鋒】微信公眾號,及時接收博文推送

設計模式 --- 模式

1.定義 提供一種方法順序訪問一個容器物件中的各個元素,而又不需要暴露該物件的內部表示。   2.使用場景 遍歷一個容器物件   3.簡單實現 大部分容器類都有提供迭代方法 不需要我們自己實現,這裡實現一個通用程式碼。 //迭代器介面 interf

設計模式-模式(Iterator)

概述 定義 : 提供一種方法, 順序訪問一個集合物件中的各個元素, 而又不暴露該物件的內部表示 型別 : 行為型 適用場景 訪問一個集合物件的內容而無需暴露它的內部表示 為遍歷不同的集合結構提供一個統一的介面 優點 分離了集合物件的遍歷

Java設計模式——模式

迭代器模式的定義是:   提供一種方法順序訪問一個聚合物件中的各個元素,而又不暴露其內部表示 問題:   這裡引用《Head First》中的一個示例,如果一個聚合物件(選單)中存在兩種不同的儲存結構(ArrayList & Array),該如何操作?   如果是簡單的逐個遍歷,程式

java設計模式——模式(Iterator Pattern)

概述:          在軟體開發中,我們經常需要使用聚合物件來儲存一系列資料。聚合物件擁有兩個職責:一是儲存資料;二是遍歷資料。從依賴性來看,前者是聚合物件的基本職責;而後者既是可變化的,又是可分離的。因此,可以將遍歷資料

移動開發之設計模式-模式(IOS&Android)

資源 完全參照 迭代器模式|菜鳥教程 ,但不包括IOS程式碼 迭代器模式 迭代器模式(Iterator Pattern)是 Java 和 .Net 程式設計環境中非常常用的設計模式。這種模式用於順序訪問集合物件的元素,不需要知道集合物件的底層表示。 迭代器模式屬於行為型模式。

淺談Java設計模式——模式(Iterator)

一、概述         給定一個語言,定義它的文法的一種表示,並定義一個直譯器,這個直譯器使用該表示來解釋語言中的句子。 二、使用場景 1.訪問一個聚合物件的內容而無需暴露它的內部表示。  2.支援對聚合物件的多種遍歷。  3.為遍歷不同的聚合結構提供一個統一的介

java設計模式----模式

定義 在軟體構建過程中,集合物件內部結構常常變化各異,但對於這些集合物件,我們希望在不暴露其內部結構的同時,可以讓外部客戶程式碼透明地訪問其中包含的元素;同時這種“透明遍歷”也為同一種演算法在多種集合物件上進行操作提供了可能。 使用面向物件技術將這種遍歷機制抽象為“迭代器物件”為“應對

設計模式模式(IteratorPattern)

核心模組:迭代器角色(定義訪問和遍歷元素的介面),具體迭代器角色,容器角色,具體容器角色 所有程式碼請訪問:[email protected]:289804201/PatternLearn.git 使用場景:外部物件訪問內部聚合物件; 優點:將儲存資料和

JavaScript設計模式--模式

迭代器模式是指提供一種方法順序訪問一個聚合物件中的各個元素,而又不需要暴露該物件的內部表示。 JavaScript中的Array.prototype.forEach 一、jQuery中的迭代器

17-Python與設計模式--模式

一、迭代器與生成器 今天的主角是迭代器模式。在python中,迭代器並不用舉太多的例子,因為python中的迭代器應用實在太多了(不管是python還是其它很多的程式語言中,實際上迭代器都已經納入到了常用的庫或者包中)。而且在當前,也幾乎沒有人專門去開發一個迭代器,而是直接去使用list、string、se

設計模式--模式與組合方法模式

迭代器模式是將對物件的遍歷封裝成迭代器,對外部隱藏物件遍歷的具體實現。 而組合方法是實現對處於不同層次的同種物件提供一致性的遍歷方法。 首先我們開始討論迭代器模式。 我們在實踐過程中可以遇到這樣的情況,我們需要對用array,ArrayList,Stack  等模式包裝的

設計模式--模式

迭代器模式(Iterator Pattern) 迭代器模式(Iterator Pattern)是java和.Net程式設計環境中非常常用的設計模式。這種模式用於順序訪問集合物件的元素,不需要知道集合物件的底層實現。大類劃分為行為型模式。 介紹 意圖:提

設計模式-模式(Iterator Pattern)

模板方法:提供一種方法順序訪問一個聚合物件中的各個元素,而又不暴露其內部的表示。 迭代器模式把在元素之間遊走的責任交給迭代器,而不是聚合物件。這不僅讓聚合的介面和實現變得更簡潔,也可以讓聚合物件更專注在它所應該專注的事情上面(也就是管理物件集合),而不必去理會遍歷的事情。

JAVA 設計模式 模式

用途 迭代器模式 (Iterator) 提供一種方法順序訪問一個聚合物件中各個元素,而又不暴露該物件的內部表示。 迭代器模式是一種行為型模式。 結構 圖-迭代器模式結構圖 Iterat

PHP設計模式——模式

宣告:本系列部落格參考資料《大話設計模式》,作者程傑。        迭代器模式:迭代器模式是遍歷集合的成熟模式,迭代器模式的關鍵是將遍歷集合的任務交給一個叫做迭代器的物件,它的工作時遍歷並選擇序列

淺析JavaScript設計模式——模式

迭代器模式 提供一種方法順序訪問一個聚合物件中的各個元素,而又不需要暴露該物件的內部表示 迭代器模式不像我們上次講的代理模式 它十分簡單,簡單到我們可能都不認為它是一種設計模式 因為我們現在使用的語言基本上內部都實現了自己的迭代器 迭代器可