设计模式详解——迭代器模式
前言
今天我们要学习的这个设计模式,我们其实在日常开发中也经常用到,但也仅仅只是用过,所以很多时候我都不觉得它是一种设计模式,它就是迭代器模式,由于这个设计模式比较简单,所以关于它我们能讲的内容也不多,因此呢,今天的内容也就比较少。
迭代器模式
迭代器模式(Iterator Pattern
)是 Java
和 .Net
编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。
迭代器模式提供了一种方法顺序,访问一个聚合对象中的各个元素,而又不暴露其内部具体实现细节
要点
- 迭代器模式让我们能游走于聚合内的每一个元素,而又不暴露其内部的实现细节
- 把游走的任务放在迭代器上,而不是聚合上。这样简化了聚合的接口和实现,也让责任各得其所
应用
关于迭代器模式,用的最多的当然就是java
容器部分的相关内容,比如Collection
接口。这里我们通过一个简易的手写容器,来演示它具体的应用场景。
适配器接口
首先是迭代器的接口,它有两个方法,一个用于判断容器是否包含元素;另一个用于拿出容器中的当前角标最小的元素(默认为为0
)
public interface Iterator {
boolean hasNext();
Object next();
}
容器接口
然后是容器接口,容器接口只有一个方法,就是获取迭代器。
public interface Container {
Iterator getIterator();
}
容器实现
容器的内部实现包括了迭代器的实现
public class SyskeContainer implements Container {
public Object[] values = {"云中志" , "java" ,"志哥" , "syske"};
@Override
public Iterator getIterator() {
return new SyskeIterator();
}
private class SyskeIterator implements Iterator {
int index;
@Override
public boolean hasNext() {
if(index < values.length){
return true;
}
return false;
}
@Override
public Object next() {
if(this.hasNext()){
return values[index++];
}
return null;
}
}
}
测试代码
下面的测试代码也很简单,就是获取SyskeContainer
的迭代器,然后通过它的迭代器,实现对SyskeContainer
容器的遍历操作:
public class SyskeContainerTest extends TestCase {
public void testIterator() {
SyskeContainer syskeContainer = new SyskeContainer();
Iterator iterator = syskeContainer.getIterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
运行结果如下:
总结
从上面的内容以及我们的代码中其实可以看出来,相比于我们前面讲到的设计模式,迭代器的内容就显得比较少,而且比较简单,更重要的是,它的应用场景也很窄,基本上都是集中在批量操作的业务中,所起的作用就是代替具体的容器,实现遍历操作,然后实现具体容器与业务之间的耦合关系。