zoukankan      html  css  js  c++  java
  • 设计模式——迭代模式

    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
  • 相关阅读:
    Android开源库
    银行卡的数字检測
    hdu4941 Magical Forest
    android之检測是否有网络
    在Oracle数据库中使用NFS,怎样调优?
    centos+nginx+php-fpm+php include fastcgi_params php页面能訪问但空白,被fastcgi_params与fastcgi.conf害慘了
    漫谈反射
    Android 四大组件学习之BroadcastReceiver二
    【LeetCode】two num 利用comparable接口 对对象进行排序
    扩展功能==继承?
  • 原文地址:https://www.cnblogs.com/DarkAngel/p/209650.html
Copyright © 2011-2022 走看看