迭代器与访问者模式:软件设计中的实用利器
1. 迭代器模式
迭代器模式是软件设计中用于遍历集合对象的一种有效方式。枚举器作为一种工厂方法,具有很大的灵活性,它可以在不修改客户端代码的情况下返回不同 MarkEnumerator
子类的对象。若要让工厂方法支持不同的遍历方式,可以让该方法接受一个指定遍历类型的参数,从而在运行时选择不同的 MarkEnumerator
。
在遍历聚合对象时修改它是有风险的。如果在聚合中添加或删除元素,可能会导致重复访问某个元素或完全错过它。简单的解决办法是对聚合进行深拷贝,然后遍历副本,但这可能会带来性能问题。
有多种实现迭代器的方法可以避免元素插入和删除的干扰,大多数方法依赖于将迭代器注册到聚合中。具体做法是,在插入或删除元素时,聚合要么调整其生成的迭代器的内部状态,要么在内部维护信息以确保正确遍历。
1.1 外部迭代器与内部迭代器
- 外部迭代器 :需要客户端向集合对象请求其迭代器,然后通过循环遍历迭代器来访问每个元素。客户端在循环中每次向迭代器发送
nextObject
消息,直到集合遍历完毕。 - 内部迭代器 :由集合对象本身控制迭代过程。可以通过让客户端为内部迭代器提供某种回调机制,使其在准备好时返回集合中的下一个元素。自 iOS SDK 4.0 引入以来,Objective - C 块成为实现内部迭代器的自然选择。块是一种函数类型,定义后可在应用程序的任何地方重用,在很多方面比 C 函数指针更强大。 <