Net设计模式实例之迭代器模式(Iterator Pattern)

简介:

一、迭代器模式简介(Brief Intro du ction

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

Provide a way to access the elements of an aggregate object sequentia ll y without exposing its underlying representation.

二、解决的问题(What To Solve

当需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,应该考虑用迭代器模式;当需要对聚集有多种方式遍历时,可以考虑使用迭代器模式。

三、迭代器模式分析(Analysis

1、迭代器模式结构

Aggragate:聚集抽象类 并通过CreateIterator()方法创建一个迭代对象。

ConcrateAggregate:具体实现类,继承于Aggregate抽象类,实现创建迭代对象的方法。

Iterator迭代抽象类:定义一个接口用于访问和遍历集合中的各个元素;

First()方法:定位第一个元素

Next()方法:定位下一个元素

IsDone()方法:是否为结尾元素

CurrentItem()方法:定位当前对象

ConcreteIterator具体迭代类:继承于Iterator抽象类,实现父类中的各个方法。

2、源代码

1聚集抽象类Aggregate及其具体实现类ConcreteAggregate

/// <summary>

/// The 'Aggregate' abstract class

/// </summary>

abstract class Aggregate

{

    public abstract Iterator CreateIterator();

}

/// <summary>

/// The 'ConcreteAggregate' class

/// </summary>

class ConcreteAggregate : Aggregate

{

    private Ar ray List _items = new Ar ray List();

    public override Iterator CreateIterator()

    {

        return new ConcreteIterator(this);

    }

 

    // Gets item count

    public int Count

    {

        get { return _items.Count; }

    }

    // Indexer

    public object this[int index]

    {

        get { return _items[index]; }

        set { _items.Insert(index, value); }

    }

}

 

2、抽象迭代器类Iterator及其具体迭代器类ConcreteIterator

/// <summary>

/// The 'Iterator' abstract class

/// </summary>

abstract class Iterator

{

    public abstract object First();

    public abstract object Next();

    public abstract bool IsDone();

    public abstract object CurrentItem();

}

/// <summary>

/// The 'ConcreteIterator' class

/// </summary>

class ConcreteIterator : Iterator

{

    private ConcreteAggregate _aggregate;

    private int _current = 0;

    // Constructor

    public ConcreteIterator(ConcreteAggregate aggregate)

    {

        this._aggregate = aggregate;

    }

    // Gets first iteration item

    public override object First()

    {

        return _aggregate[0];

    }

    // Gets next iteration item

    public override object Next()

    {

        object ret = nu ll ;

        if (_current < _aggregate.Count - 1)

        {

            ret = _aggregate[++_current];

        }

        return ret;

    }

    // Gets current iteration item

    public override object CurrentItem()

    {

        return _aggregate[_current];

    }

 

    // Gets whether iterations are complete

    public override bool IsDone()

    {

        return _current >= _aggregate.Count;

    }

}

 

3、客户端代码

static void  Main (string[] args)

{

    ConcreteAggregate a = new ConcreteAggregate();

    a[0] = "Item A";

    a[1] = "Item B";

    a[2] = "Item C";

    a[3] = "Item D";

 

    // Create Iterator and provide aggregate

    ConcreteIterator i = new ConcreteIterator(a);

    Console.WriteLine("Iterating over co ll ection:");

    object item = i.First();

    while (item != nu ll )

    {

        Console.WriteLine(item);

        item = i.Next();

    }

    // Wait for user

    Console.ReadKey();

}

3、程序运行结果

四.迭代器模式案例分析(Example

1、场景

遍历一个集合元素,在每次的遍历过程中跳过一些元素,如下图所示

IAbstractCo ll ection:聚集接口类 并通过CreateIterator()方法创建一个迭代对象。集合元素是Item.

Co ll ection:具体实现类,继承于IAbstractCo ll ection接口,实现创建迭代对象的方法。

IAbsctractIterator迭代接口类:定义一个接口用于访问和遍历集合中的各个元素;

First()方法:定位第一个元素

Next()方法:定位下一个元素

IsDone()方法:是否为结尾元素

CurrentItem()方法:定位当前对象

Iterator具体迭代类:继承于IAbsctractIterator抽象类,实现父类中的各个方法。

2、代码

1、聚集接口IAbstractCo ll ection及其实现类Co ll ection

/// <summary>

/// A co ll ection item

/// </summary>

class Item

{

    private string _name;

 

    // Constructor

    public Item(string name)

    {

        this._name = name;

    }

 

    // Gets name

    public string Name

    {

        get { return _name; }

    }

}

/// <summary>

/// The 'Aggregate' interface

/// </summary>

interface IAbstractCo ll ection

{

    Iterator CreateIterator();

}

/// <summary>

/// The 'ConcreteAggregate' class

/// </summary>

class Co ll ection : IAbstractCo ll ection

{

    private Ar ray List _items = new Ar ray List();

    public Iterator CreateIterator()

    {

        return new Iterator(this);

    }

    // Gets item count

    public int Count

    {

        get { return _items.Count; }

    }

    // Indexer

    public object this[int index]

    {

        get { return _items[index]; }

        set { _items.Add(value); }

    }

}

 

2、迭代器接口IAbstractIterator及其实现类Iterator

/// <summary>

/// The 'Iterator' interface

/// </summary>

interface IAbstractIterator

{

    Item First();

    Item Next();

    bool IsDone { get; }

    Item CurrentItem { get; }

}

/// <summary>

/// The 'ConcreteIterator' class

/// </summary>

class Iterator : IAbstractIterator

{

    private Co ll ection _co ll ection;

    private int _current = 0;

    private int _step = 1;

    // Constructor

    public Iterator(Co ll ection co ll ection)

    {

        this._co ll ection = co ll ection;

    }

    // Gets first item

    public Item First()

    {

        _current = 0;

        return _co ll ection[_current] as Item;

    }

    // Gets next item

    public Item Next()

    {

        _current += _step;

        if (!IsDone)

            return _co ll ection[_current] as Item;

        else

            return nu ll ;

    }

 

    // Gets or sets stepsize

    public int Step

    {

        get { return _step; }

        set { _step = value; }

    }

    // Gets current iterator item

    public Item CurrentItem

    {

        get { return _co ll ection[_current] as Item; }

    }

    // Gets whether iteration is complete

    public bool IsDone

    {

        get { return _current >= _co ll ection.Count; }

    }

}

 

3、客户端代码

static void  Main (string[] args)

{

    // Build a co ll ection

    Co ll ection co ll ection = new Co ll ection();

    co ll ection[0] = new Item("Item 0");

    co ll ection[1] = new Item("Item 1");

    co ll ection[2] = new Item("Item 2");

    co ll ection[3] = new Item("Item 3");

    co ll ection[4] = new Item("Item 4");

    co ll ection[5] = new Item("Item 5");

    co ll ection[6] = new Item("Item 6");

    co ll ection[7] = new Item("Item 7");

    co ll ection[8] = new Item("Item 8");

    // Create iterator

    Iterator iterator = new Iterator(co ll ection);

    // Skip every other item

    iterator.Step = 2;

    Console.WriteLine("Iterating over co ll ection:");

    for (Item item = iterator.First();

        !iterator.IsDone; item = iterator.Next())

    {

        Console.WriteLine(item.Name);

    }

    // Wait for user

    Console.ReadKey();

}

3、运行结果

五、总结(Sum ma ry

迭代器模式(Iterator Pattern),提供一种方法顺序访问一个聚合对象中元素,而不暴露改集合对象的内部表示。迭代器模式就是分离了集合对想的遍历行为,抽象出一个迭代器类来负责,这样即可以不暴露集合的内部机构,又可让外部代码透明地访问集合内部的数据

 

源代码参考:http://www.dofactory.com/Patterns/PatternIterator.aspx



 本文转自灵动生活博客园博客,原文链接:http://www.cnblogs.com/ywqu/archive/2010/02/08/1665670.html ,如需转载请自行联系原作者

相关文章
|
设计模式 算法 Java
行为型设计模式-策略模式(Strategy Pattern)
行为型设计模式-策略模式(Strategy Pattern)
|
4月前
|
Go
在golang中发起http请求以获取访问域名的ip地址实例(使用net, httptrace库)
这只是追踪我们的行程的简单方法,不过希望你跟着探险家的脚步,即使是在互联网的隧道中,也可以找到你想去的地方。接下来就是你的探险之旅了,祝你好运!
183 26
|
6月前
|
设计模式 Java 数据安全/隐私保护
Java 设计模式:装饰者模式(Decorator Pattern)
装饰者模式属于结构型设计模式,允许通过动态包装对象的方式为对象添加新功能,提供比继承更灵活的扩展方式。该模式通过组合替代继承,遵循开闭原则(对扩展开放,对修改关闭)。
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
这篇文章详细解释了工厂模式,包括简单工厂、工厂方法和抽象工厂三种类型。每种模式都通过代码示例展示了其应用场景和实现方法,并比较了它们之间的差异。简单工厂模式通过一个工厂类来创建各种产品;工厂方法模式通过定义一个创建对象的接口,由子类决定实例化哪个类;抽象工厂模式提供一个创建相关或依赖对象家族的接口,而不需要明确指定具体类。
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
|
设计模式 Java
设计模式--适配器模式 Adapter Pattern
这篇文章介绍了适配器模式,包括其基本介绍、工作原理以及类适配器模式、对象适配器模式和接口适配器模式三种实现方式。
|
设计模式 安全 Java
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
该文介绍了一种C++的编程技巧——奇异递归模板模式(CRTP),旨在让派生组件能继承基本组件的特定功能。通过示例展示了如何创建一个`Fighter`接口和`MmaFighter`类,其中`MmaFighter`及其子类如`MmaBantamweightFighter`和`MmaHeavyweightFighter`强制类型安全,确保相同重量级的拳手之间才能进行比赛。这种设计避免了不同重量级拳手间的错误匹配,编译时会报错。CRTP适用于处理类型冲突、参数化类方法和限制方法只对相同类型实例生效的情况。
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
|
设计模式
设计模式-05建造者模式(Builder Pattern)
设计模式-05建造者模式(Builder Pattern)
|
设计模式 存储 Java
Java设计模式:解释一下单例模式(Singleton Pattern)。
`Singleton Pattern`是Java中的创建型设计模式,确保类只有一个实例并提供全局访问点。它通过私有化构造函数,用静态方法返回唯一的实例。类内静态变量存储此实例,对外仅通过静态方法访问。
95 1
|
9月前
|
监控 前端开发 API
一款基于 .NET MVC 框架开发、功能全面的MES系统
一款基于 .NET MVC 框架开发、功能全面的MES系统
232 5
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
199 7