zoukankan      html  css  js  c++  java
  • 设计模式(4)迭代器模式

    概述


    迭代器模式(Iterator):提供一种方法顺次访问聚合对象中各个元素,同时不暴露对象内部细节。

    结构图


    结构

    迭代器抽象类(Iterator):负责定义访问和遍历元素的接口。

    定义当前开始对象、得到下一个对象、得到下一个对象、判断是否结尾。将列表的访问和遍历从列表对象中分离,并放到迭代器对象(Iterator)中。


    1. //迭代器抽象类  
    2.     abstract class Iterator  
    3.     {  
    4.         public abstract object First();  
    5.         public abstract object Next();  
    6.         public abstract object IsDone();  
    7.         public abstract object CurrentItem();  
    8.     }  

    具体迭代器(Concrete Iterator):实现迭代器接口,记录遍历中当前位置。

    1. //具体迭代器类,继承Iterator  
    2.     class ConcreteIterator : Iterator  
    3.     {  
    4.         private ConcreteAggregate aggregate;  
    5.         private int current = 0;  
    6.   
    7.         public ConcreteIterator(ConcreteAggregate aggregate)  
    8.         {  
    9.             this.aggregate = aggregate;  
    10.         }  
    11.   
    12.         public override object First()  
    13.         {  
    14.             return aggregate [0];  
    15.         }  
    16.   
    17.         public override object Next()  
    18.         {  
    19.             object ret = null;  
    20.             current++;  
    21.             if (current < aggregate.count)   
    22.             {  
    23.                 ret = aggregate [current];  
    24.             }  
    25.             return ret;  
    26.         }  
    27.   
    28.         public override bool  IsDone()  
    29.         {  
    30.             return current >=aggregate .count ?true:false ;  
    31.         }  
    32.   
    33.         public override object CurrentItem()  
    34.         {  
    35.             return aggregate [current ];  
    36.         }  
    37.     }  

    聚集抽象类(Aggregate):提供创建具体迭代器的接口。


    1. //聚集抽象类  
    2.     abstract class Aggreate  
    3.     {  
    4.         public abstract Iterator CreateIterator();  
    5.     }  


    具体聚集类(ConcreteAggregate):存放聚合对象,返回聚集的个数并声明一个索引器。

    1. //具体聚集类  
    2.     class ConcreteAggregate : Aggreate  
    3.     {  
    4.         private IList<object > items =new List <object >();  
    5.         public override Iterator CreateIterator()  
    6.         {  
    7.             return new ConcreteIterator(this );  
    8.         }  
    9.   
    10.         public int count  
    11.         {  
    12.             get { return items.Count; }  
    13.         }  
    14.   
    15.         public object this[int index]  
    16.         {  
    17.             get { return items[index]; }  
    18.             set { items.Insert(index, value); }  
    19.         }  
    20.     }  

    客户端

    1. static void Main(string[] args)  
    2.         {  
    3.             ConcreteAggregate a = new ConcreteAggregate();  
    4.   
    5.             a[0] = "persona";  
    6.             a[1] = "personb";  
    7.   
    8.             Iterator   i =new ConcreteIterator (a );  
    9.   
    10.             object item = i.First();  
    11.   
    12.             while (!i.IsDone())  
    13.             {  
    14.                 Console.WriteLine("{0}请先买票!",i.CurrentItem ());  
    15.                 i.Next();  
    16.             }  
    17.             Console.ReadLine();  
    18.         } 
  • 相关阅读:
    洛谷 1996——约瑟夫问题(线性数据结构)
    洛谷 1219——[USACO 1.5] 八皇后(深度优先搜索)
    洛谷 1162——填涂颜色(广度优先搜索)
    洛谷 1803——凌乱的yy(贪心)
    洛谷 1094——纪念品分组(贪心)
    洛谷 1223——排队接水(贪心)
    洛谷 1028——[USACO 1.3]混合牛奶 Mixing Milk
    洛谷 1181——数列分段Section I(贪心)
    洛谷 1090——合并果子(贪心)
    洛谷 1012——拼数(字符串处理)
  • 原文地址:https://www.cnblogs.com/guziming/p/4232750.html
Copyright © 2011-2022 走看看