应用:
当你有一个接口并需要另一个接口时,编写适配器可以解决。
(我希望在默认的前向迭代器的基础上,添加产生反向迭代器的能力,因此不能使用覆盖,而是添加了一个能够产生Iterable对象的方法,该对象可以用于foreach语句。)
代码编写:
a:类继承class ReversibleArrayList<T> extends ArrayList<T>,再写返回类型为iterator<Object>()方法,之后有提示
class ReversibleArrayList<T> extends ArrayList<T>{ // 反向迭代器
private static final long serialVersionUID = 1L;
public ReversibleArrayList(Collection<T> c){ super(c); }
public Iterable<T> reversed(){
return new Iterable<T>() {
public Iterator<T> iterator() {
return new Iterator<T>() {
int current = size() - 1;
public boolean hasNext() {return current > -1;}
public T next() {return get(current--);}
public void remove() {
throw new UnsupportedOperationException();
}
};
}
};
}
}
测试:
public class AdapterMethodIdiom {
public static void main(String[] args) {
ReversibleArrayList<String> ral = new ReversibleArrayList<String>(
Arrays.asList("To be or not to be".split(" ")));
for (String string : ral) //放在foreach语句中,将得到(默认的)向前迭代器
System.out.print(string+" ");
System.out.println();
for (String string : ral.reversed()) {
System.out.print(string+" ");
}
}
}
打印:
b:编写类继承class IterableClass implements Iterable<Object>会直接添加返回类型为Iterator<Object>的方法,return Iterator<Object>(){hasNext(),next(),remove()}
public class IterableClass implements Iterable<Object>{
protected String[] words = ("And that is how " + "we know the Earth to be banana-shaped.").split(" ");
public Iterator<Object> iterator() {
return new Iterator<Object>() {
private int index = 0;
public boolean hasNext() {return index < words.length;}
public String next() {return words[index++];}
public void remove() {throw new UnsupportedOperationException();}
};
}
}
应用:
public class MultiIterableClass extends IterableClass{
public Iterable<Object> reversed(){
return new Iterable<Object>() {
public Iterator<Object> iterator() {
return new Iterator<Object>() {
int current = words.length-1;
public void remove() {throw new UnsupportedOperationException();}
public String next() {return words[current--];}
public boolean hasNext() { return current > -1;}
};
}
};
}
public Iterable<String> randomized(){
return new Iterable<String>() {
public Iterator<String> iterator() {
List<String> shuffled = new ArrayList<String>(Arrays.asList(words));
Collections.shuffle(shuffled);//打乱数组
return shuffled.iterator();
}
};
}
public static void main(String[] args) {
MultiIterableClass mic = new MultiIterableClass();
for (Object string : mic.reversed())
System.out.print(string.toString()+" ");
System.out.println();
for (String string : mic.randomized())
System.out.print(string+" ");
System.out.println();
for (Object object : mic) {
System.out.print(object.toString()+" ");
}
}
}
控制台打印