大话设计模式之迭代器模式
迭代器模式
提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露对象的内部表示。
迭代器模式的角色构成
(1)迭代器角色(Iterator):定义遍历元素所需要的方法,一般来说会有这么三个方法:取得下一个元素的方法next(),判断是否遍历结束的方法hasNext()),移出当前对象的方法remove(),
(2)具体迭代器角色(Concrete Iterator):实现迭代器接口中定义的方法,完成集合的迭代。
(3)容器角色(Aggregate): 一般是一个接口,提供一个iterator()方法,例如java中的Collection接口,List接口,Set接口等
(4)具体容器角色(ConcreteAggregate):就是抽象容器的具体实现类,比如List接口的有序列表实现ArrayList,List接口的链表实现LinkList,Set接口的哈希列表的实现HashSet等。
模拟迭代器实现
创建迭代器角色
/** * @Author: chen * @Description: 定义抽象迭代器 * @Date: created in 2018/8/20 * @Modified By: */ public interface MyIterator { Boolean hasNext(); Object next(); }
自定一个聚集类;在聚集类内部,使用内部类的方式来定义迭代器的具体实现。
package com.chenpt.designModel.iteratorModel; import java.util.ArrayList; import java.util.List; /** * @Author: ch * @Description: 聚集类 * @Date: created in 2018/8/20 * @Modified By: */ public class Aggregate { private List<Object> list = new ArrayList<>(); public MyIterator getIterator(){ return new InnerIterator(); } public void add(Object obj){ list.add(obj); } //使用内部类来定义迭代器 private class InnerIterator implements MyIterator{ int i=0; public Boolean hasNext(){ if(i<list.size()){ return true; } return false; } public Object next(){ return list.get(i++); } } }
客户端测试
public class MainTest { public static void main(String[] args){ Aggregate aggregate = new Aggregate(); aggregate.add("上海"); aggregate.add("南京"); aggregate.add("北京"); for (MyIterator it = aggregate.getIterator();it.hasNext();){ Object o = it.next(); System.out.println(o.toString()); } } } //结果 上海 南京 北京
优点:
1、它支持以不同的方式遍历一个聚合对象。
2、迭代器简化了聚合类。
3、在同一个聚合上可以有多个遍历。
4、在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。
缺点:
由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。
作者:
不二尘
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。