Java的老一辈开发者应该比较熟悉Vector,Stack,Hashtable等集合类。它们的elements()返回一个实现了Enumeration接口的实现类。
但是自从出现Iterator以后,就很少再使用Enumeration了。
Iterator接口声明了三个方法: hasNext(),next(),remove()方法。
而Enumeration只声明了hasMoreElements()和nextElement()方法。分别对应于Iterator的hasNext和next方法。
假设现在客户端的代码只接受接口为Iterator的实现集合。但是现在我们已经拥有了Enumeration集合类。所以这个时候,我们可以使用适配器模式来解决接口不兼容的问题。
/*
* 一个简单的适配器模式例子
*
* 具体角色:
* Target - Iterator
* Adaptor - EnumerationIterator
* Adaptee - Enumeration
* client - print method
*/
package pattern.adapter;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Vector;
/**
* 把Enumeration接口转换成Iterator接口的适配器
* 适配器模式中的角色 - adaptor
*/
class EnumerationIterator<E> implements Iterator<E> {
/**
* 被适配的接口
* 适配器模式中的角色 - adaptee
*/
private Enumeration<E> enums;
public EnumerationIterator(Enumeration<E> enums) {
this.enums = enums;
}
@Override
public boolean hasNext() {
return enums.hasMoreElements();
}
@Override
public E next() {
return enums.nextElement();
}
/**
* 因为Enumeration接口不支持remove操作,所以这里简单地抛出异常
*/
@Override
public void remove() {
throw new UnsupportedOperationException();
}
}
public class Main {
public static void main(String[] args) {
Vector<String> students = new Vector<String>(Arrays.asList("Benson","Steven Jobs","Bill Gates","James Gosling","Doug Lea"));
Enumeration<String> enums = students.elements(); // 接口为Enumeration,与客户端的Iterator不兼容。
Iterator
print(new EnumerationIterator<String>(enums)); // EnumerationIterator为适配器,将不兼容的Enumeration转换成客户端需要的Iterator接口
}
/**
* 客户端只接受Iterator接口的实现类
* 适配器模式中的角色 - Client
*/
static void print(Iterator<String> iterator) {
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}