一、迭代器模式提供一种方法来访问一个容器对象中的各个元素,使该对象的内部细节对外部是隐藏的。
二、示例,一个球类迭代器类包含了football、volleyball、baseball等各个元素,该类提供了两个方法hasNext()和next()方法用来对各个元素进行迭代
package cn.edu.tju.app;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
public class BallIterator implements Iterator<String> {
private String[] ballList={"football","table tennis","baseball","volleyball"};
private int index=0;
@Override
public boolean hasNext() {
return index<ballList.length;
}
@Override
public String next() {
if(!hasNext()){
return null;
}
String result=ballList[index++];
return result;
}
}
主类如下:
package cn.edu.tju.app;
import org.apache.ibatis.reflection.property.PropertyTokenizer;
public class IteratorTest {
public static void main(String[] args) {
BallIterator ballIterator=new BallIterator();
while(ballIterator.hasNext()){
String ball=ballIterator.next();
System.out.println(ball);
}
}
}
运行结果如下:
MyBatis中的PropertyTokenizer是典型的迭代器模式:
/**
* Copyright 2009-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ibatis.reflection.property;
import java.util.Iterator;
/**
* @author Clinton Begin
*/
public class PropertyTokenizer implements Iterator<PropertyTokenizer> {
private String name;
private final String indexedName;
private String index;
private final String children;
public PropertyTokenizer(String fullname) {
int delim = fullname.indexOf('.');
if (delim > -1) {
name = fullname.substring(0, delim);
children = fullname.substring(delim + 1);
} else {
name = fullname;
children = null;
}
indexedName = name;
delim = name.indexOf('[');
if (delim > -1) {
index = name.substring(delim + 1, name.length() - 1);
name = name.substring(0, delim);
}
}
public String getName() {
return name;
}
public String getIndex() {
return index;
}
public String getIndexedName() {
return indexedName;
}
public String getChildren() {
return children;
}
@Override
public boolean hasNext() {
return children != null;
}
@Override
public PropertyTokenizer next() {
return new PropertyTokenizer(children);
}
@Override
public void remove() {
throw new UnsupportedOperationException("Remove is not supported, as it has no meaning in the context of properties.");
}
}