设计模式--迭代器模式

2023-07-19 09:15:14 浏览数 (1)

迭代器模式是一种行为型设计模式,它允许客户端遍历一种容器(如列表或数组)中的元素,并访问容器中的每个元素,而无需关心容器的内部实现。迭代器模式属性于单一职责原则,因为它将遍历和容器分离开来。

使用迭代器模式,客户端可以遍历容器中的元素,而无需了解容器的内部数据结构。这使得可以轻松添加或删除容器的元素的方式,而无需修改客户端代码。此外,迭代器模式还使客户端代码更加简洁,因为迭代器封装了遍历过程。

以下是一个简单的使用迭代器模式的C#示例:

代码语言:javascript复制
using System;
using System.Collections.Generic;

// 抽象迭代器
interface IIterator<T> 
{
    T First();
    T Next();
    bool IsDone();
    T CurrentItem();
}

// 具体迭代器
class ConcreteIterator<T> : IIterator<T>
{
    private ConcreteAggregate<T> _aggregate;
    private int _current = 0;

    public ConcreteIterator(ConcreteAggregate<T> aggregate) 
    {
        _aggregate = aggregate;
    }

    public T First() 
    {
        return _aggregate[0];
    }

    public T Next() 
    {
        T ret = default(T);
        if (_current < _aggregate.Count - 1) 
        {
            ret = _aggregate[  _current];
        }
        return ret;
    }

    public bool IsDone() 
    {
        return _current >= _aggregate.Count;
    }

    public T CurrentItem() 
    {
        return _aggregate[_current];
    }
}

// 抽象聚合类
interface IAggregate<T> 
{
    IIterator<T> CreateIterator();
}

// 具体聚合类
class ConcreteAggregate<T> : IAggregate<T>
{
    List<T> items = new List<T>();

    public IIterator<T> CreateIterator() 
    {
        return new ConcreteIterator<T>(this);
    }

    public int Count 
    {
        get 
        {
            return items.Count;
        }
    }

    public void Add(T item) 
    {
        items.Add(item);
    }

    public T this[int index] 
    {
        get 
        {
            return items[index];
        }
    }
}

class Program 
{
    static void Main() 
    {
        // 创建聚合对象
        var aggregate = new ConcreteAggregate<int>();

        // 添加元素
        aggregate.Add(1);
        aggregate.Add(2);
        aggregate.Add(3);
        aggregate.Add(4);
        aggregate.Add(5);

        // 获取迭代器
        var iterator = aggregate.CreateIterator();

        // 遍历容器中的元素
        Console.WriteLine("Iterating over collection:");
        for (var item = iterator.First(); !iterator.IsDone(); item = iterator.Next()) 
        {
            Console.WriteLine(item);
        }
    }
}

在此示例中,我们首先定义了一个抽象迭代器接口和一个具体迭代器类,以支持在容器中遍历元素。然后,我们定义了一个抽象聚合类和一个具体聚合类,以封装要遍历的容器。我们通过在具体聚合类中实现CreateIterator方法来获取Iterator对象。

在Main方法中,我们创建ConcreteAggregate实例,添加元素,然后使用CreateIterator方法创建一个具体迭代器对象。最后,我们使用迭代器遍历容器中的元素并将它们打印到控制台上。

0 人点赞