设计模式---迭代器模式
来源:互联网 发布:淘宝网老年80岁女冬装 编辑:程序博客网 时间:2024/06/05 14:53
定义
迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
理解
遍历一个数组不难,遍历一个ArrayList也不难,但是如果两个一起出现,需要你同时兼容这两个怎么办呢?
这就需要用到迭代器模式。
迭代器与集合是相关的,集合又称聚合、容器等,每个集合都可以看作一种包容对象的容器,例如数组、ArrayList、Map等等。而迭代器的作用就是遍历这些容器。
迭代器模式中有四个角色:抽象迭代器、具体迭代器、抽象容器、具体容器。
- 抽象迭代器:提供了遍历元素所需要的方法,例如hasNext()、next()、remove()等等。
- 具体迭代器:实现抽象迭代器接口。
- 抽象容器:提供一个方法,用以创建迭代器。
- 具体容器:实现抽象容器接口,用来创建具体的迭代器。
迭代器中抽象容器提供一个抽象方法,具体容器实例化迭代器。这其实就是一个工厂模式。
每新加入一种聚合对象都需要提供一个与之匹配的迭代器。
代码
抽象迭代器
public interface Iterator { boolean hasNext(); Object next(); void remove();}
具体迭代器
public class ConcreteIterator_Array implements Iterator { private Object[] array; private int position; public ConcreteIterator_Array(Object[] array) { this.array = array; } @Override public boolean hasNext() { if (position >= array.length || array[position] == null) { return false; } else { return true; } } @Override public Object next() { Object object = array[position]; position++; return object; } @Override public void remove() { if (position < 0) { throw new UnsupportedOperationException("illegal"); } if (array[position - 1] != null) { for (int i = position - 1; i < array.length - 1; i++) { array[i] = array[i + 1]; } } array[array.length - 1] = null; }}public class ConcreteIterator_ArrayList implements Iterator{ private List<Object> list = new ArrayList<>(); private int position; public ConcreteIterator_ArrayList(List<Object> list) { this.list = list; } @Override public boolean hasNext() { if(position>=list.size() || list.get(position) == null){ return false; }else { return true; } } @Override public Object next() { Object object = list.get(position); position++; return object; } @Override public void remove() { if(position<0){ throw new UnsupportedOperationException("illegal"); } if(list.get(position - 1)!=null){ for(int i = position-1;i<list.size()-1;i++){ list.set(i,list.get(i+1)); } } list.remove(list.size()-1); }}
抽象容器:
public interface Aggregate { Iterator createIterator();}
具体容器:
public class ConcreteAggregate_Array implements Aggregate { private Object[] array; public ConcreteAggregate_Array(Object[] array) { this.array = array; } @Override public Iterator createIterator() { return new ConcreteIterator_Array(array); }}public class ConcreteAggregate_ArrayList implements Aggregate { private List<Object> list = new ArrayList<>(); public ConcreteAggregate_ArrayList(List<Object> list) { this.list = list; } @Override public Iterator createIterator() { return new ConcreteIterator_ArrayList(list); }}
总结
迭代器模式将数据本身和数据的操作分开了,在不关心数据结构的情况下就能做到直接进行操作。
每增加一种集合,就需要创建相应的迭代器。
迭代器模式是在有较多种集合的情况下才会去考虑的,虽然降低了耦合,但是用起来并不一定比直接遍历轻松。
阅读全文
0 0
- 设计模式-迭代器模式
- 设计模式 迭代器模式
- 设计模式-迭代器模式
- 设计模式--迭代器模式
- 【设计模式】迭代器模式
- 设计模式-迭代器模式
- 设计模式- 迭代器模式
- 设计模式 - 迭代器模式
- 设计模式:迭代器模式
- 设计模式 - 迭代器模式
- 设计模式-迭代器模式
- 设计模式--迭代器模式
- 设计模式---迭代器模式
- 设计模式---迭代器模式
- 【设计模式】迭代器模式
- 设计模式 迭代器模式
- 设计模式--迭代器模式
- 设计模式-迭代器模式
- Leetcode 210
- 上传自己的库到 pod 的方法步骤
- 13、线程(1)
- js 将json字符串转换为json对象的方法解析
- 1-make和makefile
- 设计模式---迭代器模式
- 3785: 小X的密室
- 设计一个学生类Student
- 视频解码和绘制
- 【JAVA】等待子线程
- meshlab学习心得与收获
- 真正能用的 Latex 中文 模板 好吧,都找吐血了
- 【ZJOI2008】骑士
- window.opener用法