适配器模式的一个小实例

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

适配器模式的核心

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

  • 适配器实现目标接口

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

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

举例

在不少遗留代码中,方法的返回值为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)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容