迭代器模式:提供一種方法順序訪問(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)圖:

例子:
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)景:
新聞熱點(diǎn)
疑難解答