国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C++ > 正文

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

2020-01-26 14:41:53
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

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

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

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

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

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

適用場(chǎng)景:

  • 訪問(wèn)一個(gè)聚合對(duì)象的內(nèi)容而無(wú)需暴露它的內(nèi)部表示。
  • 支持對(duì)聚合對(duì)象的多種遍歷。
  • 為遍歷不同的聚合結(jié)構(gòu)提供一個(gè)統(tǒng)一的接口(即, 支持多態(tài)迭代)。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 惠东县| 闽清县| 清苑县| 临武县| 谷城县| 新田县| 铜陵市| 林芝县| 闽侯县| 海阳市| 浦城县| 寿光市| 阳高县| 新和县| 横山县| 肥城市| 岢岚县| 和政县| 丹阳市| 庄浪县| 渑池县| 紫阳县| 广河县| 营山县| 济宁市| 昌都县| 墨玉县| 潼南县| 孟津县| 延长县| 乐东| 玉龙| 金门县| 孟州市| 绍兴市| 嘉峪关市| 友谊县| 邓州市| 彭泽县| 左权县| 绥中县|