先从一个示例说起。该示例实现了迭代器模式的数组,可添加、可遍历数组内部的元素。而且还可以判断是否已到了数组末尾。
在这里插入图片描述首先定义了一个接口,本质上是一个迭代器:
//迭代器接口
public interface Selector {
//判断是否到了数组末尾
boolean end();
//获取当前索引所在元素
Object current();
//进入下一元素
void next();
}
接下来是主类:
// 数组序列
public class Sequence {
// Object 数组
private Object[] items;
//初始索引
private int next = 0;
//初始化序列,设定序列长度
public Sequence(int size) {
items = new Object[size];
}
//新增元素
public void add(Object x) {
if (next < items.length) {
items[next++] = x;
}
}
//实现了 Selector 接口的内部类
private class SequenceSelector implements Selector {
//初始索引
private int i = 0;
//是否已到数组末尾
public boolean end() {
return i == items.length;
}
//获取当前索引所在元素
public Object current() {
return items[i];
}
//索引加 1
public void next() {
if (i < items.length)
i++;
}
}
// 初始化 Selector 内部类实例
public Selector selector() {
return new SequenceSelector();
}
public static void main(String[] args) {
//初始化一个具有 10 个元素的序列
Sequence sequence = new Sequence(10);
for (int i = 0; i < 10; i++) {
sequence.add(Integer.toString(i));
}
//迭代输出
Selector selector = sequence.selector();
while (!selector.end()) {
System.out.print(selector.current() + " ");
selector.next();
}
}
}
有以下几点需要注意:
-
在主类中定义了返回内部类实例的方法(比如示例中的 Sequence#selector 方法),以供外部调用。这个内部类是私有的,所以可以通过这种方式被外部访问到。
-
内部类可以直接访问在主类中定义的属性或者方法,包括 private 标注的情况(比如示例中的 items 私有属性)。
参考:
BruceEckel, 埃克尔, 陈昊鹏. Java编程思想[J]. 机械工业出版社, 2007.p.190-193
网友评论