最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++設(shè)計模式編程中的迭代器模式應(yīng)用解析

 更新時間:2016年03月12日 09:50:48   作者:夢在天涯  
這篇文章主要介紹了C++設(shè)計模式編程中的迭代器模式應(yīng)用解析,迭代器模式注重對集合中元素的遍歷而不使其暴露,需要的朋友可以參考下

迭代器模式:提供一種方法順序訪問一個聚合對象中個各個元素,而不暴露該對像的內(nèi)部表示.

迭代器模式應(yīng)該是最為熟悉的模式了,最簡單的證明就是我在實(shí)現(xiàn)組合模式、享元模式、觀察者模式中就直接用到了 STL 提供的迭代器來遍歷 Vector 或者 List數(shù)據(jù)結(jié)構(gòu)。

迭代器模式也正是用來解決對一個聚合對象的遍歷問題,將對聚合的遍歷封裝到一個類中進(jìn)行,這樣就避免了暴露這個聚合對象的內(nèi)部表示的可能。

模式的動機(jī):
(1)一個聚合對象,如一個列表(List)或者一個集合(Set),應(yīng)該提供一種方法來讓別人可以訪問它的元素,而又不需要暴露它的內(nèi)部結(jié)構(gòu)。
(2)針對不同的需要,可能還要以不同的方式遍歷整個聚合對象,但是我們并不希望在聚合對象的抽象層接口中充斥著各種不同遍歷的操作。
(3)怎樣遍歷一個聚合對象,又不需要了解聚合對象的內(nèi)部結(jié)構(gòu),還能夠提供多種不同的遍歷方式,這就是迭代器模式所要解決的問題。

結(jié)構(gòu)圖:

201631294759283.jpg (560×276)

例子:

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;
    }
  }
}

適用場景:

  • 訪問一個聚合對象的內(nèi)容而無需暴露它的內(nèi)部表示。
  • 支持對聚合對象的多種遍歷。
  • 為遍歷不同的聚合結(jié)構(gòu)提供一個統(tǒng)一的接口(即, 支持多態(tài)迭代)。

相關(guān)文章

  • 一篇文章帶你了解C++多態(tài)的實(shí)現(xiàn)原理

    一篇文章帶你了解C++多態(tài)的實(shí)現(xiàn)原理

    這篇文章主要介紹了C++多態(tài)的實(shí)現(xiàn)機(jī)制理解的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下,希望能給你帶來幫助
    2021-08-08
  • OpenCV 顏色追蹤的示例代碼

    OpenCV 顏色追蹤的示例代碼

    這篇文章主要介紹了OpenCV 顏色追蹤的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • C++?Boost?Spirit進(jìn)階教程

    C++?Boost?Spirit進(jìn)階教程

    Boost是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱
    2022-11-11
  • C++ QT智能指針的使用詳解

    C++ QT智能指針的使用詳解

    這篇文章主要介紹了C++ QT智能指針的使用,Qt是一個跨平臺的C++框架,主要用來開發(fā)圖形用戶界面程序,也可以開發(fā)不帶界面的命令行程序,下面我們來了解QT智能指針是如何使用的
    2023-12-12
  • linux c 獲得當(dāng)前進(jìn)程的進(jìn)程名和執(zhí)行路徑(示例)

    linux c 獲得當(dāng)前進(jìn)程的進(jìn)程名和執(zhí)行路徑(示例)

    如何得到當(dāng)前進(jìn)程的進(jìn)程名和執(zhí)行路徑。寫了個程序分享一下
    2013-07-07
  • c語言求余數(shù)的實(shí)例講解

    c語言求余數(shù)的實(shí)例講解

    在本篇文章里小編給大家整理的是關(guān)于c語言如何求余數(shù)的相關(guān)知識點(diǎn)內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。
    2020-02-02
  • C++中關(guān)于union的使用方法說明

    C++中關(guān)于union的使用方法說明

    這篇文章主要介紹了C++中關(guān)于union的使用方法說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C語言 動態(tài)內(nèi)存開辟常見問題解決與分析流程

    C語言 動態(tài)內(nèi)存開辟常見問題解決與分析流程

    動態(tài)內(nèi)存是相對靜態(tài)內(nèi)存而言的。所謂動態(tài)和靜態(tài)就是指內(nèi)存的分配方式。動態(tài)內(nèi)存是指在堆上分配的內(nèi)存,而靜態(tài)內(nèi)存是指在棧上分配的內(nèi)存
    2022-03-03
  • C/C++利用libxml2高效輸出XML大文件詳解

    C/C++利用libxml2高效輸出XML大文件詳解

    這篇文章主要給大家介紹了關(guān)于C/C++利用libxml2高效輸出XML大文件的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • C++簡單又輕松的講解類和對象中友元函數(shù)

    C++簡單又輕松的講解類和對象中友元函數(shù)

    采用類的機(jī)制后實(shí)現(xiàn)了數(shù)據(jù)的隱藏與封裝,類的數(shù)據(jù)成員一般定義為私有成員,成員函數(shù)一般定義為公有的,依此提供類與外界間的通信接口。但是,有時需要定義一些函數(shù),這些函數(shù)不是類的一部分,但又需要頻繁地訪問類的數(shù)據(jù)成員,這時可以將這些函數(shù)定義為該類的友元函數(shù)
    2022-06-06

最新評論

曲麻莱县| 美姑县| 长顺县| 北碚区| 阳信县| 海南省| 翁牛特旗| 五莲县| 新乡县| 旅游| 安多县| 玉环县| 黑水县| 林甸县| 南川市| 河北省| 武陟县| 澄城县| 耒阳市| 南郑县| 朔州市| 屏南县| 梧州市| 镇原县| 双峰县| 土默特左旗| 方城县| 乡城县| 丰都县| 达孜县| 康马县| 长武县| 都江堰市| 木里| 清远市| 博湖县| 花莲县| 枞阳县| 辽源市| 沙坪坝区| 镇远县|