最近學習適配器模式,一直沒有找到合適的例子來直觀的感受什么是適配器模式年枕。下面給出一個簡單的示例牌芋。適配器模式的相關知識請先自行學習。
適配器模式的核心
適配器是自己定義出來的;
適配器實現(xiàn)目標接口秘狞;
適配器持有被適配接口(對象)的引用叭莫;
對目標對象(接口)的調(diào)用實際上被轉(zhuǎn)發(fā)給了被適配對象(接口);
舉例
在不少遺留代碼中烁试,方法的返回值為Enumeration,如servlet中的getParameterNames方法定義如下:
public Enumeration<String> getParameterNames();
因此此時只能使用枚舉的方式去遍歷此方法返回的集合雇初。如下:
Enumeration parameterNames = req.getParameterNames();
while (parameterNames.hasMoreElements()) {
String s = (String) parameterNames.nextElement();
System.out.println(s);
}
問題在于現(xiàn)在都是以迭代器(Iterator)的方式去遍歷集合,那如果想在代碼中以統(tǒng)一的迭代器的方式遍歷getParameterNames返回的集合應該怎么辦减响?適配器便派上了用場靖诗。
這里相當于是想把Enumeration當Iterator使用,所以Iterator是目標接口支示,而Enumeration是被適配接口
定義Enumeration到Iterator的適配器如下
public class EnumIter implements Iterator {//重點1:配器實現(xiàn)目標接口
private Enumeration e;//重點2:適配器持有被適配接口(對象)的引用
public EnumIter(Enumeration e){
this.e = e;
}
//將對目標對象的調(diào)用轉(zhuǎn)發(fā)給真正的被適配的對象
public boolean hasNext() {
return e.hasMoreElements();
}
public Object next() {
return e.nextElement();
}
public void remove() {
}
}
適配器的使用
此時可以按照迭代器的方式去遍歷枚舉類型刊橘。
Enumeration parameterNames = req.getParameterNames();
Iterator enumIter = new EnumIter(parameterNames);//這就是需要實現(xiàn)Iterator的原因
while (enumIter.hasNext()) {
String s = (String) enumIter.next();
System.out.println(s);
}
由上可知,真正做工作的還是Enumeration颂鸿,只是通過適配器這一層的包裝后促绵,外界以為使用的是Iterator。亦即嘴纺,通過適配器將對目標接口(Iterator)的調(diào)用轉(zhuǎn)發(fā)給了被適配的對象(Enumeration)