Aha!设计模式(88)-迭代器模式(4)

原创
01/12 13:10
阅读数 0


代码实例


由于迭代器已经是很多语言的标准装备,所以在实际的开发中,首先应该考虑语言中提供的迭代器,在功能不能满足需求时,根据语言定义的迭代器接口定义自己的浏览器。接下来我们通过Python语言的例子,说明几个迭代器模式的应用。


Python语言中已经事先定义了多种容器,例如列表和字典等。这些容器都提供了一个iter方法用于获取迭代器。下面使用Python语言中的迭代器来实现一个聚合类,及其子元素的表示功能。



聚合类1内部定义了一个列表,用于管理下级子元素。聚合类2不包含下级子元素,但是有三个数据成员。这两个类分别实现了iter方法,其中聚合类1返回了Python语言中列表的迭代器,聚合类2不包含下级成员,所以在它的迭代器方法中返回了数据成员的字典。准备好迭代器方法之后,用户可以使用相同的迭代器方法访问两种实现方式完全不同的聚合类。



代码中首先准备了聚合类1,然后为其增加了两个聚合类2类型的子元素。最后调用打印方法迭代输出这个聚合结构的内容。其结果如下:



可以看到聚合类2的数据成员是按照数据成员被定义的顺序输出的。在实际的开发中,有时也会希望数据成员按照另外的顺序输出。这时就需要自己定义迭代器了。



聚合类2的迭代器方法中定义了一个内嵌的迭代器类,用来调整输出成员的顺序,它的__iter__和__nexe__方法就是Python语言中(正向)迭代器的接口。代码的输出结果如下:



上述代码是使用迭代器访问不同数据结构聚合类的例子。也可以使用迭代器的组合来实现不同方式的访问。例如下面的代码使用相同的算法分别对列表和字典中的数值进行求和:


我们也可以定义另外的迭代器,用于筛选容器中的数据:



通过这个迭代器和已有迭代器的组合,我们就可以在既不改变算法又不改变数据结构的前提下实现数据的筛选:



上述代码选择列表和字典中数值大于十的数据进行求和。注意观察一下这段代码和前面求和代码的区别,看看是不是只差了一个选择迭代器?


觉得本文有帮助?请分享给更多人。

关注【面向对象思考】,轻松学习每一天!

有任何疑问,欢迎留言提问或讨论。




面向对象设计,面向对象编程,面向对象思考!  


本文分享自微信公众号 - 面向对象思考(OOThinkingDalian)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部