jackuseradmin 2019-06-27
迭代器模式(Iterator)提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该 对象的内部表示。
提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。
- 访问一个聚合对象的内容而无需暴露它的内部表示
- 支持对聚合对象的多种遍历
- 为遍历不同的聚合结构提供一个统一的接口如图:

ConcreteIterator跟踪聚合中的当前对象,并能够计算出待遍历的后继对象


package org.apache.ibatis.reflection.property;
import java.util.Iterator;
/**
* @author Clinton Begin
*/
/**
* 属性分解器,属性分解为标记,迭代子模式 如person[0].birthdate.year,将依次取
* 得person[0], birthdate, year
*
*/
public class PropertyTokenizer implements Iterable<PropertyTokenizer>, Iterator<PropertyTokenizer> {
// 例子: person[0].birthdate.year
/**
* 名字
*/
private String name; // person
/**
* 名字和下标
*/
private String indexedName; // person[0]
/**
* 下标
*/
private String index; // 0
/**
* 子节点
*/
private String children; // birthdate.year
/**
* 初始化属性分解器
* @param fullname 全名
*/
public PropertyTokenizer(String fullname) {
// person[0].birthdate.year
// 对参数进行第一次处理,通过“.”分隔符将propertyName分作两部分
int delim = fullname.indexOf('.');
if (delim > -1) {
name = fullname.substring(0, delim);
children = fullname.substring(delim + 1);
} else {
// 找不到.的话,取全部部分
name = fullname;
children = null;
}
indexedName = name;
// 把中括号里的数字给解析出来
// 对name进行二次处理,去除“[...]”,并将方括号内的内容赋给index属性,如果name属性中包含“[]”的话
delim = name.indexOf('[');
if (delim > -1) {
// 先取index内容再截取name更为方便些,要不然还需要一个临时变量,需要三步才能实现
// 这里包含了一个前提:传入的参数如果有有[,则必然存在],并且是属性的最后一个字符
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;
}
// 取得下一个,非常简单,直接再通过儿子来new另外一个实例
@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.");
}
@Override
public Iterator<PropertyTokenizer> iterator() {
return this;
}
}这样应该对这个类比较清晰了吧。
可以看到,这个类传入一个字符串到构造函数,然后提供了iterator方法对解析后的 子串进行遍历,是一个很常用的方法类。
如图:

可以看到,在mybatis中的很多地方使用到了PropertyTokenizer,这里就举例 mybatis里的这个元对象MetaObject利用这个类可以对mybatis属性进行分解使之得 到任何想要的属性。
关于PropertyTokenizer这个类。其实,在mybatis中,这个类会被频繁使用, 主要用于属性分解。这个类实现了Iterable和Iterator这两个接口,但在使用时经常 被用到的是Iterator接口中的hasNext这个函数。
这个类里最关键的还是他的构造器public PropertyTokenizer(String fullname),这个里面在初始化的时候就将传进来了fullname进行处理,我们可以 把它理解成一个属性解析器。
mybatis源码 ------https://gitee.com/SmileSnake/...
迭代器模式
如果有侵权,马上删除