设计模式之-迭代器模式

来源:互联网 发布:无印良品淘宝 编辑:程序博客网 时间:2024/04/29 21:57

软件开发中常会出现这样一种情况,一个接口里面有某类数据的增删改,也有这类数据的遍历方法,对于子类来说实现这个借口,则必须实现所有的借口方法,一旦想要更改一种新的遍历方式,则需要修改借口。这就违背了软件设计的开闭原则。同时,由于过多的借口方法设计在借口里面,这样任何一个子类都必须实现所有的方法,造成子类对象的溶于,很可能有些方法不是子类所需要的,同样这样也违背了接口隔离原则,当然要想严格的遵守接口隔离原则,对于接口的设计不大也不小,这需要对业务系统有很清晰的认识,对于方法的提炼也应该准确。同时,对于子类来说,也暴漏了父类的属性信息,因为子类也同样实现了添加的各种方法,这也违背了软件设计的封装性。

针对以上这种现象,便引入了迭代器模式。这里分为两个概念:第一个,是聚合类,也就是管理数据,否则数据的添加,删除,第二个 就是迭代器,他负责遍历聚合类数据。为此,我们可以设计聚合抽象类,注意要针对抽象编程,方便扩展,里面只有数据的添加,删除;在设计迭代器抽象类,负责遍历元素。当然,也需要在聚合抽象类里面引入创建迭代器的工厂方法,方便在创建聚合类的时候引入迭代器,当然,在具体的迭代器里面也引入了聚合类的引用,这样方便遍历数据元素。到这里,可以说一个小技巧,不难发现,在聚合类里面和迭代器里面都有双向的关联,如果我们不想再聚和类里面引入迭代器的引用,不放可以把迭代器设置为聚合类的内部类,这样对于迭代器类,就可以访问聚合类里面的数据元素了。这是内部类的一个小作用。

至此,如果我们想增加一个新的迭代器,只需要实现迭代器借口即可。对于java的JDK设计也是引用了此模式,collection和iterator分别就是对应聚合类和迭代器抽象类,里面定义的方法可以查看源码。collection借口的实现类则代表聚合类的具体实现,当然如果迭代器接口里面方法不能满足需求,则可以继承此接口,写新的接口,并写心得借口方法。

如LInkeList的listiterator迭代器借口,就是如此,具体参考源码了解。

到此为止,迭代器模式基本理论已经完成,具体代码可以参考设计模式。

原创粉丝点击