zoukankan      html  css  js  c++  java
  • C#学习笔记-迭代器模式

    什么是迭代器模式?

       迭代器模式(Iterator):提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。

    何时使用迭代器模式?

      当需要访问一个聚合对象,而且不管这些对象是什么都需要遍历的时候,需要考虑使用迭代器模式。

    迭代器模式的组成

      Iterator():迭代器抽象类,用于定义得到开始对象,对到下一个对象,判断是否到结尾,当前对象等抽象方法,统一接口。

      ConcreteAggregate():保存聚合对象。

      ConcreteIterator():继承于Iterator,实现具体如何对聚合对象的操作。

    迭代器模式具体实现

    迭代器模式的结构

      

    迭代器模式的实现:

    Iterator:

    1 abstract class Iterator
    2 {
    3     public abstract object First();
    4     public abstract object Next();
    5     public abstract bool IsDone();
    6     public abstract object CurrentItem();
    7 } 

    ConcreteIterator:

     1 //顺序遍历
     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     public override object CurrentItem()
    12     {
    13         return aggregate[current];
    14     }
    15 
    16     public override object First()
    17     {
    18         return aggregate[0];
    19     }
    20 
    21     public override bool IsDone()
    22     {
    23         return current >= aggregate.Count ? true : false;
    24     }
    25 
    26     public override object Next()
    27     {
    28         object obj = null;
    29         current++;
    30         if (current < aggregate.Count)
    31         {
    32             obj = aggregate[current];
    33         }
    34         return obj;
    35     }
    36 }
    37 //逆序遍历
    38 class ConcreteIteratorDesc : Iterator
    39 {
    40     private ConcreteAggregate aggregate;
    41     private int current = 0;
    42     //传输数据进来
    43     public ConcreteIteratorDesc(ConcreteAggregate aggregate)
    44     {
    45         this.aggregate = aggregate;
    46         current = aggregate.Count - 1;
    47     }
    48     public override object CurrentItem()
    49     {
    50         return aggregate[current];
    51     }
    52 
    53     public override object First()
    54     {
    55         return aggregate[aggregate.Count - 1];
    56     }
    57 
    58     public override bool IsDone()
    59     {
    60         return current < 0 ? true:false;
    61     }
    62 
    63     public override object Next()
    64     {
    65         object obj = null;
    66         current--;
    67         if (current >= 0)
    68         {
    69             obj = aggregate[current];
    70         }
    71         return obj;
    72     }
    73 } 

    ConcreteAggregate:

     1 /// <summary>
     2 /// 创建迭代器
     3 /// 在这里看并没有什么具体的用处
     4 /// </summary>
     5 abstract class Aggregate
     6 {
     7     public abstract Iterator CreateIterator();
     8 }
     9 
    10 /// <summary>
    11 /// 作用是保存数据,保存的数据是一系列数据,所以用数组
    12 /// 然后传输数据给ConcreteIterator
    13 /// </summary>
    14 class ConcreteAggregate : Aggregate
    15 {
    16     //用于存放聚合对象
    17     private IList<object> items = new List<object>();
    18     public override Iterator CreateIterator()
    19     {
    20         return new ConcreteIterator(this);
    21     }
    22     //数组的长度,也就是ConcreteAggregate的属性
    23     public int Count { get { return items.Count; } }
    24     /// ConcreteAggregate现在是数组形式
    25     /// get获取当前的数据
    26     /// set将新来的数据插入到ConcreteAggregate中
    27     public object this[int index]
    28     {
    29         get { return items[index]; }
    30         set { items.Insert(index, value); }
    31     }
    32 } 

    主函数调用:

     1 static void Main(string[] args)
     2 {
     3     ConcreteAggregate a = new ConcreteAggregate();
     4     a[0] = "A";
     5     a[1] = "B";
     6     a[2] = "C";
     7     a[3] = "D";
     8     a[4] = "E";
     9     a[5] = "F";
    10 
    11     Iterator i = new ConcreteIterator(a);
    12     object item = i.First();
    13     while (!i.IsDone())
    14     {
    15         Console.WriteLine("{0} buy ticket,please", i.CurrentItem());
    16         i.Next();
    17     }
    18 
    19     Iterator id = new ConcreteIteratorDesc(a);
    20     object itemdec = id.First();
    21     while (!id.IsDone())
    22     {
    23         Console.WriteLine("{0} buy ticket,please", id.CurrentItem());
    24         id.Next();
    25     }
    26 
    27     Console.Read();
    28 } 

    .NET的迭代器实现

      迭代器模式在我们现在的使用中其实没有那么麻烦,因为.NET框架已经准备好了相关的接口,只需要实现就好了。

     1 static void Main(string[] args)
     2 {
     3     IList<string> a = new List<string>();
     4 
     5     a.Add("A");
     6     a.Add("B");
     7     a.Add("C");
     8     a.Add("D");
     9     a.Add("E");
    10     a.Add("F");
    11 
    12     //看见遍历首先考虑foreach
    13     foreach (string item in a)
    14     {
    15         Console.WriteLine("{0} buy ticket,please", item);
    16     }
    17     //支持在泛型集合上进行简单迭代。
    18     IEnumerator<string> e = a.GetEnumerator();
    19     while (e.MoveNext())
    20     {
    21         Console.WriteLine("{0} buy ticket,please", e.Current);
    22     }
    23 
    24     Console.Read();
    25 } 

     补充:IEnumerator

      

    备注:文中所有代码及知识点均来自于《大话设计模式》,本人属于边学边看边敲代码边总结的阶段。

  • 相关阅读:
    eclipse 工程没有build path
    Redis中RedisTemplate和Redisson管道的使用
    Spring多开发环境配置
    Commons Configuration之三Properties文件
    Commons Configuration之二基本特性和AbstractConfiguration
    Commons Configuration之一简介
    Commons DbUtils
    这可能是最容易入门的socket教程了
    图解leetcode —— 124. 二叉树中的最大路径和
    图解leetcode —— 395. 至少有K个重复字符的最长子串
  • 原文地址:https://www.cnblogs.com/Aries-rong/p/7911072.html
Copyright © 2011-2022 走看看