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

简介: 一、迭代器模式简介(Brief Introduction) 迭代器模式(Iterator Pattern),提供一种方法顺序访问一个聚合对象中元素,而不暴露改集合对象的内部表示。 Provide a way to access the elements of an aggregate obj...

一、迭代器模式简介(Brief Introduction

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

Provide a way to access the elements of an aggregate object sequentially 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 ArrayList _items = new ArrayList();

    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 = null;

        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 collection:");

    object item = i.First();

    while (item != null)

    {

        Console.WriteLine(item);

        item = i.Next();

    }

    // Wait for user

    Console.ReadKey();

}

3、程序运行结果

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

1、场景

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

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

Collection:具体实现类,继承于IAbstractCollection接口,实现创建迭代对象的方法。

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

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

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

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

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

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

2、代码

1、聚集接口IAbstractCollection及其实现类Collection

/// <summary>

/// A collection 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 IAbstractCollection

{

    Iterator CreateIterator();

}

/// <summary>

/// The 'ConcreteAggregate' class

/// </summary>

class Collection : IAbstractCollection

{

    private ArrayList _items = new ArrayList();

    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 Collection _collection;

    private int _current = 0;

    private int _step = 1;

    // Constructor

    public Iterator(Collection collection)

    {

        this._collection = collection;

    }

    // Gets first item

    public Item First()

    {

        _current = 0;

        return _collection[_current] as Item;

    }

    // Gets next item

    public Item Next()

    {

        _current += _step;

        if (!IsDone)

            return _collection[_current] as Item;

        else

            return null;

    }

 

    // Gets or sets stepsize

    public int Step

    {

        get { return _step; }

        set { _step = value; }

    }

    // Gets current iterator item

    public Item CurrentItem

    {

        get { return _collection[_current] as Item; }

    }

    // Gets whether iteration is complete

    public bool IsDone

    {

        get { return _current >= _collection.Count; }

    }

}

 

3、客户端代码

static void Main(string[] args)

{

    // Build a collection

    Collection collection = new Collection();

    collection[0] = new Item("Item 0");

    collection[1] = new Item("Item 1");

    collection[2] = new Item("Item 2");

    collection[3] = new Item("Item 3");

    collection[4] = new Item("Item 4");

    collection[5] = new Item("Item 5");

    collection[6] = new Item("Item 6");

    collection[7] = new Item("Item 7");

    collection[8] = new Item("Item 8");

    // Create iterator

    Iterator iterator = new Iterator(collection);

    // Skip every other item

    iterator.Step = 2;

    Console.WriteLine("Iterating over collection:");

    for (Item item = iterator.First();

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

    {

        Console.WriteLine(item.Name);

    }

    // Wait for user

    Console.ReadKey();

}

3、运行结果

五、总结(Summary

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

 

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

 

版权

作者:灵动生活 郝宪玮

出处:http://www.cnblogs.com/ywqu

如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章,

img_2c313bac282354945ea179a807d7e70d.jpg

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

 

相关文章
|
Java C#
使用C# (.NET Core) 实现适配器模式 (Adapter Pattern) 和外观模式 (Facade Pattern)
本文的概念内容来自深入浅出设计模式一书 现实世界中的适配器(模式) 我带着一个国标插头的笔记本电脑, 来到欧洲, 想插入到欧洲标准的墙壁插座里面, 就需要用中间这个电源适配器. 面向对象的适配器 你有个老系统, 现在来了个新供应商的类, 但是它们的接口不同, 如何使用这个新供应商的类呢? 首先, 我们不想修改现有代码, 你也不能修改供应商的代码.
1773 0
|
C#
使用C# (.NET Core) 实现组合设计模式 (Composite Pattern)
本文的概念性内容来自深入浅出设计模式一书. 本文需结合上一篇文章(使用C# (.NET Core) 实现迭代器设计模式)一起看. 上一篇文章我们研究了多个菜单一起使用的问题. 需求变更 就当我们感觉我们的设计已经足够好的时候, 新的需求来了, 我们不仅要支持多种菜单, 还要支持菜单下可以拥有子菜单.
1464 0
|
Java C# 设计模式
使用C# (.NET Core) 实现迭代器设计模式 (Iterator Pattern)
本文的概念来自深入浅出设计模式一书 项目需求 有两个饭店合并了, 它们各自有自己的菜单. 饭店合并之后要保留这两份菜单. 这两个菜单是这样的: 菜单项MenuItem的代码是这样的: 最初我们是这样设计的, 这是第一份菜单: 这是第2份菜单: 同时有两个菜单存在的问题 问题就是多个菜单把事情变复杂了.
1036 0
|
算法 C# Java
使用C# (.NET Core) 实现模板方法模式 (Template Method Pattern)
本文的概念内容来自深入浅出设计模式一书. 项目需求 有一家咖啡店, 供应咖啡和茶, 它们的工序如下: 咖啡: 茶: 可以看到咖啡和茶的制作工序是差不多的, 都是有4步, 其中有两步它们两个是一样的, 另外两步虽然具体内容不一样, 但是都做做的同一类工作.
1382 0
|
C#
使用C# (.NET Core) 实现命令设计模式 (Command Pattern)
本文的概念内容来自深入浅出设计模式一书. 项目需求 有这样一个可编程的新型遥控器, 它有7个可编程插槽, 每个插槽可连接不同的家用电器设备. 每个插槽对应两个按钮: 开, 关(ON, OFF).
860 0
|
Java C#
使用C# (.NET Core) 实现单体设计模式 (Singleton Pattern)
本文的概念内容来自深入浅出设计模式一书 由于我在给公司做内培, 所以最近天天写设计模式的文章.... 单体模式 Singleton 单体模式的目标就是只创建一个实例. 实际中有很多种对象我们可能只需要它们的一个实例, 例如: 线程池,缓存, 弹出的对话框, 用于保存设置的类, 用于logging的类, 硬件设备驱动对象等等.
1226 0
|
C#
使用C# (.NET Core) 实现抽象工厂设计模式 (Abstract Pattern)
本文的概念性内容来自深入浅出设计模式一书. 上一篇文章讲了简单工厂和工厂方法设计模式 http://www.cnblogs.com/cgzl/p/8760250.html, 使用的是披萨店的例子. 文将继续使用这个例子, 这里要用到抽象工厂.
1373 0
|
C# 设计模式 .NET
使用C# (.NET Core) 实现简单工厂(Simple Factory) 和工厂方法设计模式 (Factory Method Pattern)
本文源自深入浅出设计模式. 只不过我是使用C#/.NET Core实现的例子.   前言 当你看见new这个关键字的时候, 就应该想到它是具体的实现. 这就是一个具体的类, 为了更灵活, 我们应该使用的是接口(interface).
1460 0
|
安全 C# 数据安全/隐私保护
使用C# (.NET Core) 实现装饰模式 (Decorator Pattern) 并介绍 .NET/Core的Stream
该文章综合了几本书的内容. 某咖啡店项目的解决方案 某咖啡店供应咖啡, 客户买咖啡的时候可以添加若干调味料, 最后要求算出总价钱. Beverage是所有咖啡饮料的抽象类, 里面的cost方法是抽象的.
1393 0
|
C#
使用C# (.NET Core) 实现观察者模式 (Observer Pattern) 并介绍 delegate 和 event
观察者模式 这里面综合了几本书的资料. 需求 有这么个项目:  需求是这样的: 一个气象站, 有三个传感器(温度, 湿度, 气压), 有一个WeatherData对象, 它能从气象站获得这三个数据.
1970 0