适配器模式的一个小实例

最近学习适配器模式,一直没有找到合适的例子来直观的感受什么是适配器模式。下面给出一个简单的示例。适配器模式的相关知识请先自行学习。

适配器模式的核心

  • 适配器是自己定义出来的;

  • 适配器实现目标接口

  • 适配器持有被适配接口(对象)的引用

  • 对目标对象(接口)的调用实际上被转发给了被适配对象(接口)

举例

在不少遗留代码中,方法的返回值为Enumeration,如servlet中的getParameterNames方法定义如下:


public Enumeration 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)

你可能感兴趣的:(适配器模式的一个小实例)