设计模式(15)——迭代器模式

迭代器模式(Iterator Pattern)是一种非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。

一共四个角色
迭代器角色(Iterator):迭代器角色负责定义访问和遍历元素的接口
具体迭代器角色(MyIteraror):具体迭代器角色实现了迭代器接口,并需要记录遍历中的当前位置。
聚合角色(Container):聚合角色负责定义获得迭代器角色的接口
具体聚合角色(MyContainer):具体聚合角色实现聚合角色接口。

class Program
{
    static void Main(string[] args)
    {
        Iterator iterator;
        Container container = new MyContainer();
        iterator = container.GetIterator();

        while (iterator.HasNext())
        {
            int i = (int)iterator.GetCurrent();
            Console.WriteLine(i.ToString());
            iterator.Next();
        }

        Console.Read();
    }
}
interface Iterator
{
    bool HasNext();
    void Next();
    Object GetCurrent();
}
interface Container
{
    Iterator GetIterator();
}
class MyContainer : Container
{
    int[] collection;
    public MyContainer()
    {
        collection = new int[] { 2, 4, 6, 8 };
    }
    public Iterator GetIterator()
    {
        return new MyIterator(this);
    }
    public int Length
    {
        get
        {
            return collection.Length;
        }
    }
    public int GetElement(int index)
    {
        return collection[index];
    }
}
class MyIterator : Iterator
{
    // 迭代器要集合对象进行遍历操作,自然就需要引用集合对象
    private MyContainer _list;
    private int _index;

    public MyIterator(MyContainer list)
    {
        _list = list;
        _index = 0;
    }
    public bool HasNext()
    {
        if (_index < _list.Length)
        {
            return true;
        }
        return false;
    }

    public void Next()
    {
        if (_index < _list.Length)
        {
            _index++;
        }
    }

    public object GetCurrent()
    {
        return _list.GetElement(_index);
    }
}

类图

在这里插入图片描述

优点与缺点

迭代器模式的优点:

  • 迭代器模式使得访问一个聚合对象的内容而无需暴露它的内部表示,即迭代抽象。
  • 迭代器模式为遍历不同的集合结构提供了一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作

迭代器模式的缺点:

  • 迭代器模式在遍历的同时更改迭代器所在的集合结构会导致出现异常。所以使用foreach语句只能在对集合进行遍历,不能在遍历的同时更改集合中的元素。

本文主要借鉴了《Gof设计模式》,对于在.Net中关于迭代器的更多的内容可以看我之前的文章迭代器的实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值