• 设计模式——迭代模式


    Iterator
    结构  
    意图 提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。
    适用性
    • 访问一个聚合对象的内容而无需暴露它的内部表示。
    • 支持对聚合对象的多种遍历。
    • 为遍历不同的聚合结构提供一个统一的接口(即, 支持多态迭代)。
    Code Example
      1// Iterator
      2
      3// Intent: "Provide a way to access the elements of an aggregate object 
      4// sequentially without exposing its underlying representation". 
      5
      6// For further information, read "Design Patterns", p257, Gamma et al.,
      7// Addison-Wesley, ISBN:0-201-63361-2
      8
      9/* Notes:
     10 * Here wish wish to separate node traversal from the nodes themselves. 
     11 * STL in ISO C++ is a highly successful application of this pattern.
     12 * Generic programming is a great way to implement iterators. As this is 
     13 * not yet in C#, we use inheritance. 
     14 *  
     15 */

     16 
     17namespace Iterator_DesignPattern
     18{
     19    using System;
     20    using System.Collections;
     21
     22    class Node 
     23    {
     24        private string name;
     25        public string Name 
     26        {
     27            get 
     28            {
     29                return name;    
     30            }

     31        }

     32        public Node(string s)
     33        {
     34            name = s;
     35        }

     36    }

     37    
     38    class NodeCollection 
     39    {
     40        private ArrayList list = new ArrayList();
     41        private int nodeMax = 0;
     42        
     43        // left as a student exercise - implement collection
     44        // functions to remove and edit entries also
     45        public void AddNode(Node n)
     46        {
     47            list.Add(n); 
     48            nodeMax++;            
     49        }
            
     50        public Node GetNode(int i)
     51        {
     52            return ((Node) list[i]);
     53        }

     54
     55        public int NodeMax 
     56        {            
     57            get 
     58            {
     59                return nodeMax;
     60            }

     61        }

     62    }

     63
     64    /*
     65     * The iterator needs to understand how to traverse the collection 
     66     * It can do that as way it pleases - forward, reverse, depth-first, 
     67     */

     68    abstract class Iterator 
     69    {
     70        abstract public Node Next();        
     71    }

     72
     73    class ReverseIterator : Iterator
     74    {
     75        private NodeCollection nodeCollection;
     76        private int currentIndex;
     77
     78        public ReverseIterator (NodeCollection c)
     79        {
     80            nodeCollection = c;            
     81            currentIndex = c.NodeMax -1// array index starts at 0!
     82        }

     83
     84        // note: as the code stands, if the collection changes,
     85        // the iterator needs to be restarted 
     86        override public Node Next()
     87        {
     88            if (currentIndex == -1)
     89                return null;
     90            else 
     91                return(nodeCollection.GetNode(currentIndex--));
     92        }

     93    }

     94    
     95    /// <summary>
     96    ///    Summary description for Client.
     97    /// </summary>

     98    public class Client
     99    {
    100        public static int Main(string[] args)
    101        {   
    102            NodeCollection c = new NodeCollection();
    103            c.AddNode(new Node("first"));
    104            c.AddNode(new Node("second"));
    105            c.AddNode(new Node("third"));
    106
    107            // now use iterator to traverse this
    108            ReverseIterator i = new ReverseIterator(c);
    109
    110            // the code below will work with any iterator type
    111            Node n;
    112            do 
    113            {
    114                n = i.Next();
    115                if (n != null
    116                    Console.WriteLine("{0}", n.Name);
    117            }
     while (n != null);
    118                
    119            return 0;
    120        }

    121    }

    122}

    123
    124
  • 相关阅读:
    第二十课字符串
    数学归纳法:搞定循环与递归的钥匙
    11预处理命令下
    Xshell6无法连接上虚拟机的解决方法
    redis数据库常用命令
    redis使用get命令,中文乱码问题
    Ubuntu下redis的安装和简单操作
    启动hbase后,使用指令进入shell命令行模式时报错"wrong number of arguments (0 for 1)"
    启动hbase报错:“SLF4J: Class path contains multiple SLF4J bindings.”解决方法
    ./bin/hadoop 提示“没有那个文件或目录”解决方法
  • 原文地址:https://www.cnblogs.com/DarkAngel/p/209650.html
Copyright © 2020-2023  润新知