williambirkin

恭喜发财!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

意图

提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。

使用场合

1.访问一个聚合对象的内容而无需暴露他的内部表示。

2.支持对聚合对象的多种遍历。

3.为遍历不同的聚合对象提供一个统一的接口。

结构

Iteator(迭代器):定义访问和遍历元素的接口。

ConcreteIteator(具体迭代器):实现迭代器,该聚合遍历时跟踪当前位置。

Aggregate(聚合):创建相应迭代对象的接口,这是一个工厂方法。

ConcreteAggregate(具体聚合):实现创建相应迭代器的接口,该操作返回ConcreteIteator的一个适当实例,这是抽象工厂方法的实现。



效果 

采用迭代器模式可以实现对聚合的多种遍历方式,如对于树型结构的聚合,可以采用深度优先遍历和广度优先遍历。只要采用不同的迭代器实例代替原先的实例即可。

迭代器简化了聚合的接口,聚合不用包含于迭代相关的操作。迭代器对象保持迭代的状态,因此可以同时有多个迭代器存在。



.NET中的强类型集合与迭代器模式

下面是2.0的代码,与1.1的实现区别不大。只是在用“IEnumerable<>”和“IEnumerator<>”代替了“IEnumerable”和“IEnumerator”。
“IEnumerable<>”和“IEnumerator<>”指定了具体类型,在实现和使用强类型集合时更方便。

.Net引入两个接口实现迭代器模式,聚合类需要实现IEnumerable接口,相应的迭代器类需要实现IEnumerator接口。

集合中的子类:

using System;
using System.Collections.Generic;
using System.Text;

namespace IteratorPattern.ex27_3
{
    
public class MyClass
    
{
        
public string FirstName;
        
public string LastName;
    }

}

集合类:

using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;

namespace IteratorPattern.ex27_3
{
    
class MyClassCollection:CollectionBase,IEnumerable<MyClass>
    
{
        
public MyClass this[int index]
        
{
            
get return (MyClass)List[index]; }
        }


        
public int Add(MyClass m)
        
{
            
return List.Add(m);
        }


        
IEnumerable 成员

        
private class MyEnumerator : IEnumerator<MyClass>
        
{
            
private int index = -1;
            
private MyClassCollection mcs;

            
public MyEnumerator(MyClassCollection ms)
            
{
                
this.mcs = ms;
            }


            
IEnumerator 成员

            
IDisposable メンバ

            
IEnumerator 成员
        }

    }

}

测试代码:

        static void ex273()
        
{
            IteratorPattern.ex27_3.MyClassCollection mcs 
= new IteratorPattern.ex27_3.MyClassCollection();

            Console.WriteLine(
"Add Item");

            
for (int i = 0; i < 3; i++)
            
{
                IteratorPattern.ex27_3.MyClass mc 
= new IteratorPattern.ex27_3.MyClass();
                
                mc.FirstName 
= "FirstName" + i.ToString();
                mc.LastName 
= "LastName" + i.ToString();

                Console.WriteLine(
"{0} {1}", mc.FirstName, mc.LastName);

                mcs.Add(mc);
            }


            Console.WriteLine(
"foreach collection");

            
foreach (IteratorPattern.ex27_3.MyClass mc in mcs)
            
{
                Console.WriteLine(
"{0} {1}",mc.FirstName,mc.LastName);
            }


            IEnumerator
<IteratorPattern.ex27_3.MyClass> ien = mcs.GetEnumerator();

            Console.WriteLine(
"use IEnumerator<>");

            
while (ien.MoveNext())
            
{
                IteratorPattern.ex27_3.MyClass mc 
= ien.Current;

                Console.WriteLine(
"{0} {1}", mc.FirstName, mc.LastName);
            }

        }


遍历Web缓存
Web缓存Cache实现了IEnumerable接口,它可以创建一个类型为IDictionaryEnumerator的迭代器实现对缓存内容的遍历。

IDictionaryEnumerator CacheEnum=Cache.GetEnumerator();
                
while(CacheEnum.MoveNext())
{
  
object item = CacheEnum.Current;
}


相关模式
1.组合模式:迭代器经常用于对复合对象的访问。
2.工厂方法:被迭代器访问的对象采用工厂方法实例化迭代器。
posted on 2007-02-08 09:24  williambirkin  阅读(299)  评论(0编辑  收藏  举报