Java与模式笔记(21)

迭代子(Iterator)模式又叫游标(Cursor)模式,是对象的行为模式。迭代子模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象。

迭代子模式结构与角色

 

抽象迭代子(Iterator)角色:此抽象角色定义出遍历元素所需的接口。

具体迭代子(ConcreteIterator)角色:此角色实现了Iterator接口,并保持迭代过程中的游标位置。

聚集(Aggregate)角色:此抽象角色给出创建迭代子(Iterator)对象的接口。

具体聚集(ConcreteAggregate)角色:实现了创建迭代子(Iterator)对象的接口,返回一个合适的具体迭代子实例。

客户端(Client)角色:持有对聚集及其迭代子对象的引用,调用迭代子对象的迭代接口,可有可能通过迭代子操作聚集元素的增加和删除。

如果一个聚集的接口提供了可以用来修改聚集元素的方法,这个接口就是所谓的宽接口

如果一个聚集的接口没有提供修改聚集元素的方法,这样的接口就是所谓的窄接口

提供宽接口的聚集叫做白箱聚集,迭代子叫做外禀迭代子(Extrinsic Iterator

在改良的设计中,聚集对象为迭代子对象提供一个宽接口,而为其他对象提供一个窄接口,即聚集不向外部提供遍历自己元素对象的接口。在Java语言中,实现双重接口的办法就是将迭代子类设计成聚集类的内部成员类。这种聚集叫做黑箱聚集,迭代子叫做内禀迭代子(Intrinsic Iterator

如果客户端控制迭代的进程,那么这样的迭代子就是主动迭代子,相反就是被动迭代子

使用外禀迭代子的一个重要理由是它们可以被几个不同的方法和对象共同享用和控制。使用内禀迭代子的优点是它不破坏聚集的封装。

静态迭代子由聚集对象创建,并持有聚集对象的一个快照(snapshot),在产生后这个快照的内容就不再变化。客户端可以继续修改原聚集的内容,但是迭代子对象不会反映出聚集的新变化。

动态迭代子则与静态迭代子完全相反,在迭代子被产生后,迭代子保持着对聚集元素的引用,因此,任何对原聚集内容的修改都会在迭代子对象上反映出来。

过滤迭代子可以在扫过聚集元素的同时进行计算,以确定呈现给客户端的元素都是满足某一个过滤条件的,或者这些元素已经了重新的排列等。

迭代子模式的优点

1、  迭代子模式简化了聚集的界面。迭代子具备了一个遍历接口,这样聚集的接口就不必具备遍历接口。

2、  每一个聚集对象都可以有一个或一个以上的迭代子对象,每一个迭代子的迭代状态可以是彼此独立的。因此,一个聚集对象可以同时有几个迭代在进行之中。

3、  由于遍历算法被封装在迭代子角色里面,因此迭代的算法可以独立于聚集角色变化。

迭代子模式的缺点

1、  迭代子模式给客户端一个聚集被顺序化的错觉,因为大多数的情况下聚集的元素并没有确定的顺序,但是迭代必须以一定线性顺序进行。如果客户端误以为顺序是聚集本身具有的特性而过度依赖于聚集元素的顺序,很可能得出错误的结果。

迭代子给出的聚集元素没有类型特征。一般而言,迭代子给出的元素都是Object类型,因此,客户端必须具备这些元素类型的知识才能使用这些元素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值