[断断续续,瞎掰胡扯]我的设计模式-Iterator(迭代器)

Gof说:提供一种方法顺序访问一个聚合对象中的各元素,而又不暴露该对象的内部表示。

关键思想是将对列表的访问和遍历从列表对象中分离出来,并放入一个迭代器(iterator)对象中。

 

示例:班级(Classes)是一个聚合对象,里面包含一定数量的学生(Student),获取每个学生的信息。

Aggregate代表聚集体.实现了Aggregate接口的类都属于聚集体.包含一个获取迭代器的iterate的方法.

Iterator迭代器接口,提供执行遍历的功能hasNext与next方法.

Classes为班级类,实现了Aggregate接口所以它是一个聚集体,内部包含了一个Student数组和一个size,可以添加学生和获取班级迭代器进行迭代.

ClassesIterator班级类的迭代器,实现了Iterator接口,提供对班级内的学生进行迭代的功能.包含一个被迭代班级的对象和一个迭代索引位置.

Student学生信息.

代码Aggregate:

代码Iterator:

代码Classes:

代码ClassesIterator:

代码Student:

测试代码IteratorTest:

 

 

Iterator:

ClassesIterator:

IteratorTest:

 

      为什么要在Iterator Pattern这么麻烦的东西上花时间?以数组概念思考Pattern,用for语句让他循环下去不就得了吗?为什么出了聚合之外,还要特别建立像Iterator这样的参与者?

      最大的理由是因为利用Iterator可以跟实现分开,单独进行递增,请看下面的程序代码:

      这里只用到hasNext和next这两个Iterator的方法。并没有调用Classes实现时所使用的方法。换句话说,这里的while循环不会受到Classes实现的影响。

      像上面的例子开始的时候使用数组管理学生,后面换成了vector。无论Classes修改成怎样,Classes仍然还有iterate方法,只要能返回正确的Iterator(即返回正常实现了hasNext,next方法的类的对象实例),上面的while循环即使一字不改也能正常执行。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值