C++設(shè)計(jì)模式編程中的迭代器模式應(yīng)用解析
迭代器模式:提供一種方法順序訪問一個(gè)聚合對象中個(gè)各個(gè)元素,而不暴露該對像的內(nèi)部表示.
迭代器模式應(yīng)該是最為熟悉的模式了,最簡單的證明就是我在實(shí)現(xiàn)組合模式、享元模式、觀察者模式中就直接用到了 STL 提供的迭代器來遍歷 Vector 或者 List數(shù)據(jù)結(jié)構(gòu)。
迭代器模式也正是用來解決對一個(gè)聚合對象的遍歷問題,將對聚合的遍歷封裝到一個(gè)類中進(jìn)行,這樣就避免了暴露這個(gè)聚合對象的內(nèi)部表示的可能。
模式的動(dòng)機(jī):
(1)一個(gè)聚合對象,如一個(gè)列表(List)或者一個(gè)集合(Set),應(yīng)該提供一種方法來讓別人可以訪問它的元素,而又不需要暴露它的內(nèi)部結(jié)構(gòu)。
(2)針對不同的需要,可能還要以不同的方式遍歷整個(gè)聚合對象,但是我們并不希望在聚合對象的抽象層接口中充斥著各種不同遍歷的操作。
(3)怎樣遍歷一個(gè)聚合對象,又不需要了解聚合對象的內(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;
}
}
}
適用場景:
- 訪問一個(gè)聚合對象的內(nèi)容而無需暴露它的內(nèi)部表示。
- 支持對聚合對象的多種遍歷。
- 為遍歷不同的聚合結(jié)構(gòu)提供一個(gè)統(tǒng)一的接口(即, 支持多態(tài)迭代)。
相關(guān)文章
一篇文章帶你了解C++多態(tài)的實(shí)現(xiàn)原理
這篇文章主要介紹了C++多態(tài)的實(shí)現(xiàn)機(jī)制理解的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下,希望能給你帶來幫助2021-08-08
linux c 獲得當(dāng)前進(jìn)程的進(jìn)程名和執(zhí)行路徑(示例)
如何得到當(dāng)前進(jìn)程的進(jìn)程名和執(zhí)行路徑。寫了個(gè)程序分享一下2013-07-07
C語言 動(dòng)態(tài)內(nèi)存開辟常見問題解決與分析流程
動(dòng)態(tài)內(nèi)存是相對靜態(tài)內(nèi)存而言的。所謂動(dòng)態(tài)和靜態(tài)就是指內(nèi)存的分配方式。動(dòng)態(tài)內(nèi)存是指在堆上分配的內(nèi)存,而靜態(tài)內(nèi)存是指在棧上分配的內(nèi)存2022-03-03

