C++設(shè)計(jì)模式編程中的迭代器模式應(yīng)用解析
迭代器模式:提供一種方法順序訪問一個(gè)聚合對(duì)象中個(gè)各個(gè)元素,而不暴露該對(duì)像的內(nèi)部表示.
迭代器模式應(yīng)該是最為熟悉的模式了,最簡(jiǎn)單的證明就是我在實(shí)現(xiàn)組合模式、享元模式、觀察者模式中就直接用到了 STL 提供的迭代器來遍歷 Vector 或者 List數(shù)據(jù)結(jié)構(gòu)。
迭代器模式也正是用來解決對(duì)一個(gè)聚合對(duì)象的遍歷問題,將對(duì)聚合的遍歷封裝到一個(gè)類中進(jìn)行,這樣就避免了暴露這個(gè)聚合對(duì)象的內(nèi)部表示的可能。
模式的動(dòng)機(jī):
(1)一個(gè)聚合對(duì)象,如一個(gè)列表(List)或者一個(gè)集合(Set),應(yīng)該提供一種方法來讓別人可以訪問它的元素,而又不需要暴露它的內(nèi)部結(jié)構(gòu)。
(2)針對(duì)不同的需要,可能還要以不同的方式遍歷整個(gè)聚合對(duì)象,但是我們并不希望在聚合對(duì)象的抽象層接口中充斥著各種不同遍歷的操作。
(3)怎樣遍歷一個(gè)聚合對(duì)象,又不需要了解聚合對(duì)象的內(nèi)部結(jié)構(gòu),還能夠提供多種不同的遍歷方式,這就是迭代器模式所要解決的問題。
結(jié)構(gòu)圖:

例子:
namespace Iterator_DesignPattern
{
using System;
using System.Collections;
class Node
{
private string name;
public string Name
{
get
{
return name;
}
}
public Node(string s)
{
name = s;
}
}
class NodeCollection
{
private ArrayList list = new ArrayList();
private int nodeMax = 0;
// left as a student exercise - implement collection
// functions to remove and edit entries also
public void AddNode(Node n)
{
list.Add(n);
nodeMax++;
}
public Node GetNode(int i)
{
return ((Node) list[i]);
}
public int NodeMax
{
get
{
return nodeMax;
}
}
}
/*
* The iterator needs to understand how to traverse the collection
* It can do that as way it pleases - forward, reverse, depth-first,
*/
abstract class Iterator
{
abstract public Node Next();
}
class ReverseIterator : Iterator
{
private NodeCollection nodeCollection;
private int currentIndex;
public ReverseIterator (NodeCollection c)
{
nodeCollection = c;
currentIndex = c.NodeMax -1; // array index starts at 0!
}
// note: as the code stands, if the collection changes,
// the iterator needs to be restarted
override public Node Next()
{
if (currentIndex == -1)
return null;
else
return(nodeCollection.GetNode(currentIndex--));
}
}
/// <summary>
/// Summary description for Client.
/// </summary>
public class Client
{
public static int Main(string[] args)
{
NodeCollection c = new NodeCollection();
c.AddNode(new Node("first"));
c.AddNode(new Node("second"));
c.AddNode(new Node("third"));
// now use iterator to traverse this
ReverseIterator i = new ReverseIterator(c);
// the code below will work with any iterator type
Node n;
do
{
n = i.Next();
if (n != null)
Console.WriteLine("{0}", n.Name);
} while (n != null);
return 0;
}
}
}
適用場(chǎng)景:
- 訪問一個(gè)聚合對(duì)象的內(nèi)容而無需暴露它的內(nèi)部表示。
- 支持對(duì)聚合對(duì)象的多種遍歷。
- 為遍歷不同的聚合結(jié)構(gòu)提供一個(gè)統(tǒng)一的接口(即, 支持多態(tài)迭代)。
相關(guān)文章
OpenCV實(shí)現(xiàn)相機(jī)標(biāo)定示例詳解
相機(jī)標(biāo)定是圖像處理的基礎(chǔ),現(xiàn)在市面上買到的相機(jī),都存在著或多或少的畸變。本文將介紹如何利用一系列棋盤照片進(jìn)行攝像機(jī)標(biāo)定的,感興趣的小伙伴可以關(guān)注一下2021-11-11
C++編譯錯(cuò)誤variable-sized?object?may?not?be?initiali問題
這篇文章主要介紹了C++編譯錯(cuò)誤variable-sized?object?may?not?be?initiali問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05
詳細(xì)講解C語言中的數(shù)據(jù)以及位運(yùn)算
這篇文章主要為大家詳細(xì)介紹了C語言中數(shù)據(jù)表示方法以及位運(yùn)算的相關(guān)知識(shí)點(diǎn),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-06-06
C++超詳細(xì)講解模擬實(shí)現(xiàn)vector
這篇文章主要介紹了C++ 容器 Vector 的使用方法,Vector 是一個(gè)能夠存放任意類型的動(dòng)態(tài)數(shù)組,有點(diǎn)類似數(shù)組,是一個(gè)連續(xù)地址空間,下文更多詳細(xì)內(nèi)容的介紹,需要的小伙伴可以參考一下2022-07-07

