迭代器模式 (Iterator)
概念
迭代器模式是一种行为设计模式,可以在不暴露集合底层表现形式(列表、栈和树等)的情况下遍历集合中所有的元素。
- 单一职责原则。通过将体积庞大的遍历算法代码抽取为独立的类,可对客户端代码和集合进行整理。
- 开闭原则。可实现新型的集合和迭代器并将其传递给现有代码,无需修改现有代码。
- 可以并行遍历同一集合,因为每个迭代器对象都包含其自身的遍历状态。
- 可以暂停遍历并在需要时继续。
- 如果你的程序只与简单的集合进行交互,应用该模式可能会矫枉过正。
- 对于某些集合,使用迭代器可能比直接遍历的效率低。
示例
举例说明,以下代码对微信好友进行遍历。定义了两个接口 SocialNetwork、ProfileIterator<T> 和两个类 Wechat、WechatIterator。
Wechat 类要实现 SocialNetwork 接口,来实现创建微信迭代器的工厂方法,并储存好友列表、提供增加好友和获取好友的方法。
WeChatIterator 类要实现 ProfileIterator<T> 接口,来实现一些具体的微信迭代器方法,用来迭代好友列表。
// 声明用于生成迭代器的工厂方法
interface SocialNetwork {
createFriendsIterator(): ProfileIterator<string | null>;
}
// 声明迭代器接口
interface ProfileIterator<T> {
// 返回当前项,并向后移一位
next(): T;
// 返回当前项
current(): T;
}
// 实现生成迭代器的工厂方法,和一些 Wechat 类自有的方法
class Wechat implements SocialNetwork {
private friendList: string[] = [];
createFriendsIterator(): ProfileIterator<string | null> {
// 迭代器指向本实例
return new WeChatIterator(this);
}
public addFriend(friend: string) {
this.friendList.push(friend);
}
public getFriendList() {
return this.friendList;
}
}
// 实现具体的微信好友迭代器类
class WeChatIterator implements ProfileIterator<string | null> {
private wechat: Wechat; // 微信实例
private position = 0; // 记录当前迭代到的位置
constructor(weChat: Wechat) {
this.wechat = weChat;
}
// 返回当前项,并后移一位;若已经遍历完,没有数据了,返回 null
next(): string | null {
return this.wechat.getFriendList()[this.position++] || null;
}
current(): string {
return this.wechat.getFriendList()[this.position];
}
}
const wechat = new Wechat();
wechat.addFriend('Lee');
wechat.addFriend('Tom');
wechat.addFriend('Bella');
const iterator = wechat.createFriendsIterator();
let curr;
while ((curr = iterator.next())) {
console.log(curr);
}
输出:
Lee
Tom
Bella