Skip to content

Head First 设计模式 10-迭代器模式

🏷️ 《Head First 设计模式》

迭代器模式 提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。

书中示例是用 Java 写的,需要用到 java.util.Iterator 接口,C# 中对应的是 IEnumerator 接口,不过方法名稍有区别。

csharp
public interface IEnumerator
{
    object Current { get; }
    bool MoveNext();
    void Reset();
}

C# 若要自定义类型支持 foreach 关键字(Java 中对应的是 for/in 语法),需要继承 IEnumerable<T>IEnumerable 接口,通过其 GetEnumerator 方法获取继承 IEnumerator 的类的实例。

csharp
public interface IEnumerable
{
    IEnumerator GetEnumerator();
}

自定义迭代器的类图如下:

C# 中继承了 IEnumerable<T>IEnumerable 的所有类,都可以通过 GetEnumerator() 方法(Java 中对应的是 iterator() 方法)获取迭代器。下面是一个简单的示例:

csharp
var arr = new List<string>() { "1", "3", "2" };
var enumerator = arr.GetEnumerator();
while (enumerator.MoveNext())
{
    Console.WriteLine(enumerator.Current);
}

设计原则

No.9 单一职责

一个类应该只有一个引起变化的原因。

这个原则告诉我们,尽量让每个类保持单一职责。

区分设计中的责任,是最困难的事情之一。