最近学习适配器模式,一直没有找到合适的例子来直观的感受什么是适配器模式。下面给出一个简单的示例。适配器模式的相关知识请先自行学习。
适配器模式的核心
适配器是自己定义出来的;
适配器实现目标接口;
适配器持有被适配接口(对象)的引用;
对目标对象(接口)的调用实际上被转发给了被适配对象(接口);
举例
在不少遗留代码中,方法的返回值为Enumeration,如servlet中的getParameterNames方法定义如下:
public Enumeration<String> getParameterNames();
因此此时只能使用枚举的方式去遍历此方法返回的集合。如下:
Enumeration parameterNames = req.getParameterNames();
while (parameterNames.hasMoreElements()) {
String s = (String) parameterNames.nextElement();
System.out.println(s);
}
问题在于现在都是以迭代器(Iterator)的方式去遍历集合,那如果想在代码中以统一的迭代器的方式遍历getParameterNames返回的集合应该怎么办?适配器便派上了用场。
这里相当于是想把Enumeration当Iterator使用,所以Iterator是目标接口,而Enumeration是被适配接口
定义Enumeration到Iterator的适配器如下
public class EnumIter implements Iterator {//重点1:配器实现目标接口
private Enumeration e;//重点2:适配器持有被适配接口(对象)的引用
public EnumIter(Enumeration e){
this.e = e;
}
//将对目标对象的调用转发给真正的被适配的对象
public boolean hasNext() {
return e.hasMoreElements();
}
public Object next() {
return e.nextElement();
}
public void remove() {
}
}
适配器的使用
此时可以按照迭代器的方式去遍历枚举类型。
Enumeration parameterNames = req.getParameterNames();
Iterator enumIter = new EnumIter(parameterNames);//这就是需要实现Iterator的原因
while (enumIter.hasNext()) {
String s = (String) enumIter.next();
System.out.println(s);
}
由上可知,真正做工作的还是Enumeration,只是通过适配器这一层的包装后,外界以为使用的是Iterator。亦即,通过适配器将对目标接口(Iterator)的调用转发给了被适配的对象(Enumeration)