青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

積木

No sub title

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  140 Posts :: 1 Stories :: 11 Comments :: 0 Trackbacks

常用鏈接

留言簿(1)

我參與的團隊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

轉載自:http://patmusing.blog.163.com/blog/static/13583496020101501613155/

Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation. – GoF

提供一種方法,以順序訪問一個聚合對象中的元素,而又不暴露該聚合對象之內部表示。

An aggregate object such as a list should give you a way to access its elements without exposing its internal structure. Moreover, you might want to traverse the list in different ways, depending on what you want to accomplish. But you probably don’t want to bloat the List interface with operations for different traversals, even if you could anticipate the ones you will need. You might also need to have more than one traversal pending on the same list.

The Iterator pattern lets you do all this. The key idea in this pattern is to take the responsibility for access and traversal out of the list object and put it into an iterator object. The Iterator class defines an interface for accessing the list’s elements. An iterator object is responsible for keeping track of the current element; that is, it knows which elements have been traversed already.

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

Iterator設計模式UML類圖:

19. C++實現Behavioral - Iterator模式 - 玄機逸士 - 玄機逸士博客

要點:

- 迭代抽象: 訪問一個聚合對象的內容,而無需暴露其內部表示。

- 迭代多態: 為遍歷不同的集合結構提供一個統一的接口,從而支持同樣的算法在不同的集合結構上進行操作。

- 迭代器通常不應該修改所在集合的結構,如刪除其中一個元素,也就是迭代器通常是只讀的,但未必盡然。

下面是具體的C++實現代碼:

// Iterator.h

#include <string>

#include <iostream>

#include <memory>

using namespace std;

// 這個類將作為集合中的元素

class Person

{

private:

string name;

string mobilephone;

public:

// 由于ConcreteCollection類的構造函數中的collection = new T[100];這一句,因此,Person

// 必須提供缺省構造函數

Person()

{

}

Person(const string name, const string mobilephone)

{

this->name = name;

this->mobilephone = mobilephone;

}

~Person()

{

//由于Person類的析構函數會被調用很多次,所以就把下面一行注釋了,以便使得輸出更整潔一些

//cout << "in the destructor of Person..." << endl;

}

public:

// 顯示元素本身的內容

string to_string()

{

string str = name + "\t" + mobilephone;

return str;

}

};

// 這是迭代器所必須實現的接口

template <typename T>

class IIterator

{

public:

virtual T next() = 0; // 取出下一個元素

virtual bool has_next() = 0; // 遍歷完了嗎?如果遍歷完,則返回false;否則,返回true

public:

virtual ~IIterator()

{

cout << "in the destructor of IIterator..." << endl;

}

};

// 定義IIterable接口,所有的欲使用迭代器的集合類,都必須繼承它

template <typename T>

class IIterable

{

public:

virtual auto_ptr<IIterator<T> > get_iterator() = 0; // 獲取迭代器(智能指針)

public:

virtual ~IIterable()

{

cout << "in the destructor of IIterable..." << endl;

}

};

// 具體集合類

template <typename T>

class ConcreteCollection : public IIterable<T>

{

private:

int index;

T *collection;

public:

ConcreteCollection()

{

collection = new T[100];

index = 0;

}

// 增加一個元素

void add_element(T obj)

{

collection[index++] = obj;

}

// 獲取一個指定位置的元素

T get_element_at(int i)

{

return collection[i];

}

// 獲取集合中元素的個數

int get_size()

{

return index;

}

// 獲取迭代器(智能指針)

auto_ptr<IIterator<T> > get_iterator()

{

auto_ptr<IIterator<T> > temp(new ConcreteIterator<Person>(this));

return temp;

}

public:

~ConcreteCollection()

{

delete [] collection; // 對應構造函數中的collection = new T[100];

cout << "in the destructor of ConcreteCollection..." << endl;

}

};

// 具體迭代器類

template <typename T>

class ConcreteIterator : public IIterator<T>

{

private:

int index;

ConcreteCollection<T> *collection;

public:

ConcreteIterator(IIterable<T> *iterable)

{

index = 0;

collection = dynamic_cast<ConcreteCollection<T> *>(iterable);

// 向下轉型,即將基類的指針轉換為派生類的指針,此處使用dynamic_cast

// 是為了進行嚴格的類型檢查。一般而言,向下轉型時不安全的,因此要使

// dynamic_cast

}

bool has_next()

{

if(0 == collection->get_size())

{

return false;

}

if(index < collection->get_size())

{

return true;

}

else

{

return false;

}

}

T next()

{

return collection->get_element_at(index++);

}

public:

~ConcreteIterator()

{

cout << "in the destructor of ConcreteIterator..." << endl;

}

};

// Iterator.cpp

#include "Iterator.h"

int main(int argc, char **argv)

{

ConcreteCollection<Person> *collection = new ConcreteCollection<Person>();

collection->add_element(Person("玄機逸士", "13800000001"));

collection->add_element(Person("上官天野", "13800000002"));

collection->add_element(Person("黃藥師 ", "13800000003"));

collection->add_element(Person("歐陽鋒 ", "13800000004"));

collection->add_element(Person("段王爺 ", "13800000005"));

collection->add_element(Person("洪七公 ", "13800000006"));

auto_ptr<IIterator<Person> > iter(collection->get_iterator());

while(iter->has_next())

{

cout << (iter->next()).to_string() << endl;

}

delete collection;

return 0;

}

運行結果:

玄機逸士 13800000001

上官天野 13800000002

黃藥師 13800000003

歐陽鋒 13800000004

段王爺 13800000005

洪七公 13800000006

in the destructor of ConcreteCollection...

in the destructor of IIterable...

in the destructor of ConcreteIterator...

in the destructor of IIterator...

與上述程序對應的UML類圖:

19. C++實現Behavioral - Iterator模式 - 玄機逸士 - 玄機逸士博客

Iterator模式實現需注意的要點:

1. 兩個重要接口,即IIterableIIterator,它們分別對應的具體類ConcreteCollectionConcreteIterator。本質上而言ConcreteCollection中存放的是數據,ConcreteIterator中實現的是遍歷的方法。

2. ConcreteCollection中的getIterator()方式的實現技巧。即

return new ConcreteIterator(this);

ConcreteCollection將自己(當然也包括ConcreteCollection中包含的數據)通過ConcreteIterator的構造函數,傳遞給ConcreteIterator,然后ConcreteIterator利用已實現的方法對其進行遍歷。

3. 模板類的應用。上述實現由于使用了模板,因此ConcreteCollection中的元素也可以是除Person類之外的其他類型。

posted on 2013-03-08 12:57 Jacc.Kim 閱讀(226) 評論(0)  編輯 收藏 引用 所屬分類: 設計模式
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国模大胆一区二区三区| 欧美v亚洲v综合ⅴ国产v| 一本久道久久综合中文字幕 | 亚洲欧美精品一区| 日韩一级免费| 亚洲国产你懂的| 裸体一区二区| 亚洲国产日韩欧美综合久久| 欧美一区二区在线看| 狂野欧美激情性xxxx欧美| 精品9999| 欧美日韩一区二区免费在线观看 | 国产亚洲欧美日韩精品| 麻豆精品视频在线观看| 免费在线一区二区| 亚洲视频网站在线观看| 香蕉久久夜色精品| 亚洲精品欧洲精品| 国产欧美大片| 久久亚洲私人国产精品va媚药 | 久久gogo国模啪啪人体图| 国产一区二区久久久| 在线播放视频一区| 国产精品国产三级欧美二区| 久久精品在线| 一本色道久久综合亚洲精品婷婷| 日韩一区二区免费高清| 亚洲综合三区| 亚洲视频免费在线| 久久久精品一品道一区| 欧美伦理在线观看| 国产一区二区三区成人欧美日韩在线观看 | 欧美大片专区| 亚洲一区二区三区在线| 国产麻豆精品theporn| 欧美日韩1区2区| 久久免费视频在线观看| 国产精品第13页| 亚洲美女在线视频| 亚洲激情六月丁香| 亚洲一区在线免费| 香蕉久久夜色精品| 亚洲第一成人在线| 狼狼综合久久久久综合网| 日韩视频在线一区二区三区| 欧美一区二区三区精品电影| 国产精品久久久久aaaa九色| 亚洲乱码精品一二三四区日韩在线| 久久国产夜色精品鲁鲁99| 亚洲综合二区| 亚洲日本在线视频观看| 亚洲福利国产| 久久不射网站| 欧美一区三区二区在线观看| 欧美巨乳在线| 亚洲精选视频免费看| 久热爱精品视频线路一| 欧美在线一级va免费观看| 久久综合久久综合九色| 蜜臀久久久99精品久久久久久| 黄色成人av| 亚洲黄一区二区| 久久av一区二区三区亚洲| 欧美刺激性大交免费视频| 欧美在线视频二区| 国语自产精品视频在线看抢先版结局 | 性久久久久久久久久久久| 亚洲国产欧美不卡在线观看| 欧美一区二区观看视频| 国产欧美精品一区aⅴ影院| 新狼窝色av性久久久久久| 中文一区字幕| 国产欧美综合在线| 久久不射电影网| 久久五月天婷婷| 亚洲黄色片网站| 亚洲黄一区二区| 欧美大片在线观看| 欧美成人国产一区二区| 国产精品高潮呻吟久久| 亚洲视频国产视频| 久久天天躁夜夜躁狠狠躁2022| 亚洲国产精品黑人久久久| 麻豆免费精品视频| 亚洲视频axxx| 久久夜色精品国产欧美乱| 日韩视频在线一区二区| 久久久噜噜噜久久中文字免| 亚洲三级视频| 国产精品多人| 麻豆成人精品| 欧美色网一区二区| 亚洲欧洲精品天堂一级| 亚洲欧美另类在线| 久久精品五月| 一本色道久久综合亚洲二区三区 | 免费看黄裸体一级大秀欧美| 精品动漫一区| 亚洲国产成人在线| 欧美色视频在线| 免费的成人av| 国产精品婷婷| 亚洲视频电影在线| 久久激情综合网| 亚洲午夜视频在线| 久久久久久久久久看片| 国产精品人成在线观看免费 | 国产精品五月天| 亚洲国产美女| 激情五月综合色婷婷一区二区| 99国产精品国产精品久久| 欧美激情视频在线播放| 在线精品国精品国产尤物884a| 欧美一区视频在线| 亚洲少妇自拍| 91久久夜色精品国产九色| 亚洲欧美日韩一区二区三区在线| 欧美日本高清视频| 免费av成人在线| 国产日韩欧美综合一区| 欧美在线综合视频| 欧美日韩一区二区三区免费| 巨胸喷奶水www久久久免费动漫| 国产精品成人播放| 亚洲电影免费在线观看| 国内精品一区二区| 欧美在线免费看| 久久精品视频在线看| 国产精品久久久久999| 亚洲激情综合| 99re6热只有精品免费观看| 久久综合伊人77777| 欧美亚洲在线播放| 亚洲精品激情| 久久久国产视频91| 久久精品成人一区二区三区 | 久久久人成影片一区二区三区观看 | 日韩一级片网址| 美女国产精品| 久久理论片午夜琪琪电影网| 国产精品永久免费在线| 一区二区三区回区在观看免费视频| 亚洲国产欧美一区二区三区久久| 欧美一区二区三区视频在线| 午夜精品亚洲| 久久成人精品视频| 欧美在线观看一二区| 国产日韩欧美高清免费| 亚洲欧美在线免费观看| 久久福利影视| 国内精品视频久久| 久久这里有精品视频| 蜜臀av在线播放一区二区三区| 在线成人国产| 欧美区国产区| 在线一区二区三区四区五区| 性久久久久久久| 国产字幕视频一区二区| 久热精品视频在线观看一区| 亚洲欧洲精品成人久久奇米网| 亚洲视频日本| 国产视频久久网| 久久久蜜桃精品| 最新高清无码专区| 午夜久久影院| 黄色成人av在线| 欧美另类一区二区三区| 亚洲影院色无极综合| 国产麻豆精品视频| 亚洲欧美日韩综合| 欧美激情亚洲国产| 影音先锋欧美精品| 欧美精品在线观看一区二区| aa成人免费视频| 久久久久久高潮国产精品视| 亚洲国产精品一区二区三区| 欧美一区成人| 久久免费视频在线观看| 在线亚洲一区| 欧美日韩视频| 久久精品国产精品亚洲| 亚洲人成在线观看| 久久理论片午夜琪琪电影网| 一区二区三区|亚洲午夜| 狠色狠色综合久久| 欧美婷婷久久| 乱中年女人伦av一区二区| 亚洲一区二区在线观看视频| 亚洲成色777777女色窝| 在线欧美影院| 欧美日韩伊人| 免费在线观看日韩欧美| 亚洲欧美日韩一区在线| 亚洲七七久久综合桃花剧情介绍| 久久久五月天| 欧美一区二区三区男人的天堂| 亚洲久久成人| 最新国产精品拍自在线播放| 韩国av一区| 国产农村妇女精品|