Java适配器
上一篇笔记说到,如果想要做一个反向迭代器和随机迭代器,那么不应该覆盖原有的方法,而是应该创建新的方法。
当有一个接口需要另外一个接口的时候,编写适配器就可以解决问题。适配器有时候只是将原有的接口接口做了另外一层封装,看下面这个代码
传统方法
protected String[] words = "H W R D A D Y F A E I K N P".split(" ");
// Iterable需要返回一个Iterator
// Iterator也是一个接口,需要实现两个方法
@Override
public Iterator<String> iterator() {
return new Iterator<String>() {
private int index = 0;
@Override
public boolean hasNext() {
return index < words.length;
}
@Override
public String next() {
return words[index++];
}
};
}
适配器修改,返回一个新的接口
public Iterable<String> reversed() {
// 返回一个新的接口
return new Iterable<String>() {
@Override
public Iterator<String> iterator() {
return new Iterator<String>() {
private int current = words.length - 1;
@Override
public boolean hasNext() {
return current > -1;
}
@Override
public String next() {
return words[current--];
}
};
}
};
}
适配器,返回一个随机的值。
public Iterable<String> randomized() {
return new Iterable<String>() {
@Override
public Iterator<String> iterator() {
List<String> shuffled = new ArrayList<String>(Arrays.asList(words));
Collections.shuffle(shuffled);
return shuffled.iterator();
}
};
}
Iterable接口需要返回一个Iterator
测试结果:
public static void main(String[] args) {
IterableClass testIterable = new IterableClass();
for (String s : testIterable) {
System.out.print(s + " ");
}
System.out.println();
for (String s : testIterable.reversed()) {
System.out.print(s + " ");
}
System.out.println();
for(String s : testIterable.randomized()) {
System.out.print(s + " ");
}
}