美文网首页
适配器模式的一个小实例

适配器模式的一个小实例

作者: UnivJS | 来源:发表于2016-05-24 10:14 被阅读997次

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

    适配器模式的核心

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

    • 适配器实现目标接口

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

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

    举例

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

    相关文章

      网友评论

          本文标题:适配器模式的一个小实例

          本文链接:https://www.haomeiwen.com/subject/hokzrttx.html