《Head First Design Patterns》笔记十:迭代器模式(Iterator Pattern)

 概述

      computer初始翻译为计算机.为何,计算数据.处理数据.很好理解,我们在电脑上的所有的应用无非只是一段一段的数据集.那么数据怎么读取保存排序等等,方式各种各样,当我们处理数据集的时候,就先需要了解数据集的具体存储方式,复杂点的甚至需要理清里面各字段的意义,然后再来读取,这显然增加了应用的复杂度,有没有好的模式,让我们不需要了解细节.就能够处理数据呢,有,Iterator就是其中一种被广泛应用的模式,在microsoft数据处理的类中大量应用了Iterator,这个后面再说,我们先来个实例.

实例

     还是餐厅,供应早餐和正餐,吃饭吗,早餐和午餐大不同,这里由不同的师傅负责.菜单有大量的菜式,这就是数据集.2个师傅现在提供的数据集存储方式不一样.早餐师傅用的是数组,正餐师傅用的是List,简单视图如下

 

     服务员现在要报菜单,就需要预先了解2个师傅的内里数据存储方式,才能正确把每个菜式读出来.

 但我们思考下,其实不管是list也好,还是数组也好,这些都是有序数据,one by one 的,如下,

   服务员并不需要了解具体数据存储的实际方式,只需要one by one的一个一个拿就对了.那么我们就需要用到ITerator 模式了,我们创建一个IITerator接口,有3个方法Next(),HasNext(),Reset(),如下

 

    让每个菜单都生成一个Iterator,服务员只需要调用Iterator的Next()方法,就可以获得菜式,而不在需要了解实际的存储方式,这就是尽量将少双方的依赖,实现松耦合.uml如下

  

     如上图,我们看到,服务员现在只依赖于IIterator接口,而不再依赖于BreakfastMenu和DinnerMenu,当BreakfastMenu,DinnerMenu存储方式改变的时候,对于服务员来说,不关心,也不需要知道.

     这里有一点要指出,为什么要把Iterator分开为一个类呢,比如BreakfastMenu和BreakfastIterator都是描述Breakfast的,何在一起不是更好,这就牵涉到一个极为重要的面向对象的原则:"类的单一职责 ",每个类只负责单一职责,这里BreakfastIterator负责遍历,这是一个单一职责,而与Breakfast分离.单一职责 有什么好处呢,我们知道,或则可以说,面向对象就是面向修改编程.一个类应该只因为1个理由而修改 ,这有利于让复杂的问题简单化,另外,单一职责同时有利于代码重用 .

 

代码实现

  接下来就是代码实现了.首先是MenuItem,BreakfastMenu,DinnerMenu,代码如下:  

  然后实现Iterator,3个类,1个IITerator接口,以及BreakfastIterator,DinnerIterator,代码如下.

   接着就是waitress服务生的实现了,服务生现在并不需要关心菜单的具体存储方式,直接调用的Iterator来达到数据的访问,代码如下

   最后就是测试运行了

结果如下:

Breakfast:
Pancake 's price is 1.5
Waffle 's price is 2
Egg 's price is 0.5
Dinner:
Hotdog 's price is 1.05
Soup of the day 's price is 1
Blt 's price is 4

 

总结

    什么是Iterator,就是让一组数据集合可以再不暴露内部数据实现的情况下实现遍历所有数据.

 

.net环境下的改进

     前面提到microsoft在Iterator的应用,我们打开C#一些数据集的代码,比如Array,List,我们看到什么,它们都会有一个共同点,就是实现了IEnumerable接口,这个接口是做什么的呢,我们来看接口内定义的方法

      我们发现没,Enumerator不就是Iterator吗,所有实现IEnumerable的类就意味着这个类内部将创建Enumerator(Iterator)来让客户方便遍历所有集合,实现也很简单,用Foreach语句就可以遍历实现IEnumerable的类。

      以上的代码我们就不再需要3个Iterator类/接口,改写BreakfastMenu和DinnerMenu,让它们实现IEnumerable代码如下

 

 

      这里用IEnumerator GetEnumerator 代替了GetIterator,注意,这里可以代码来实现Enumerator,但也可以直接用yield return item,表示将自动创建Enumerator,并将item按顺序加入自动创建的Enumerator中,这样代码就简洁很多。

    Waitress直接用Foreach遍历即可,代码如下

 

 

 Enmerator作为Iterator的一种实现,已经成为.net中的一个语言规范,如果在.net中编写Iterator,直接用Enumerator会更加方便和简洁 

 

 

下一篇:  《Head First Design Patterns》笔记十一:组合模式(Composite Pattern)

上一篇:《Head First Design Patterns》笔记九:模版模式(Template Method Pattern)

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值