C#设计模式18——迭代器模式的写法

2023-10-21 18:32:32 浏览数 (1)

是什么:

迭代器模式是一种行为型设计模式,它允许客户端通过一种统一的方式遍历集合对象中的元素,而无需暴露集合对象的内部结构。

为什么:

使用迭代器模式可以使得客户端程序与集合对象解耦,从而可以更加灵活地对集合对象进行遍历操作。此外,迭代器模式还可以提高代码的复用性,简化客户端程序的代码量,使得代码更加易于维护和扩展。

怎么做:

在迭代器模式中,我们首先定义一个抽象迭代器接口 Iterator,它定义了常规的迭代器操作方法,如 HasNext、Next 等等。

接下来,我们定义一个抽象的聚合类 Aggregate,它持有一个用于遍历其元素的 Iterator 对象,并且定义了一个返回 Iterator 对象的方法 CreateIterator。

在其具体子类中,我们定义具体的集合类,如 ListAggregate 等,它们实现了自己的 CreateIterator 方法,返回一个针对该集合类的迭代器对象 ConcreteIterator。

在 ConcreteIterator 迭代器对象中,我们实现了 Iterator 接口中的操作方法,并且管理着对集合对象的引用,以便于操作集合中的元素。

下面是在 C# 语言中实现迭代器模式的一个示例代码:  

代码语言:javascript复制
// 抽象迭代器
public interface Iterator
{
    bool HasNext();
    object Next();
}

// 抽象聚合类
public interface Aggregate
{
    Iterator CreateIterator();
}

// 具体迭代器
public class ConcreteIterator : Iterator
{
    private ListAggregate list;
    private int index = 0;

    public ConcreteIterator(ListAggregate list)
    {
        this.list = list;
    }

    public bool HasNext()
    {
        return index < list.Count;
    }

    public object Next()
    {
        if (HasNext())
        {
            return list[index  ];
        }
        else
        {
            return null;
        }
    }
}

// 具体聚合类
public class ListAggregate : Aggregate
{
    private List<object> list = new List<object>();

    public Iterator CreateIterator()
    {
        return new ConcreteIterator(this);
    }

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

    public object this[int index]
    {
        get { return list[index]; }
        set { list.Add(value); }
    }
}

在这个代码示例中,我们首先定义了一个抽象迭代器接口 Iterator 和一个抽象聚合类 Aggregate,并在其中定义了常规的迭代器操作方法和返回迭代器对象的方法 CreateIterator。接下来,我们定义了具体的聚合类 ListAggregate,并实现了其 CreateIterator 方法,返回一个针对该集合类的迭代器对象 ConcreteIterator。在 ConcreteIterator 对象中,我们实现了 Iterator 接口中的操作方法,并且管理着对集合对象的引用,以便于操作集合中的元素。

何时使用:

当我们需要遍历一个聚合对象中的所有元素时,可以使用迭代器模式。此外,如果我们希望更加灵活并且不暴露集合对象的内部结构时,也可以使用迭代器模式。

0 人点赞