zoukankan      html  css  js  c++  java
  • 设计模式——适配器模式

    适配器模式定义将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。

     

      我们首先需要明白什么是适配器,如上图是电源插座适配器。通过这一个适配器可以让三孔插座“插到”二孔插座上。而在实际编码中,如果两个接口之间能搭配使用,第一种方法就是改变其中一方的源码,但是很多时候这需要很大的工作量,这是我们可以在这两个接口之间加一个适配器,这样就可以相对来说用较少的人力、物力消耗来达到同样的效果。

      举个例子来说:在Java早期的集合类型中都实现了一个elements()方法,该方法会返回一个Enumeration类型,Enumeration接口中定义了两个方法hasMoreElements()和nextElements(),用来对集合中的元素进行遍历。而在Sum公司推出新的集合类之后,开始使用Iterator接口来对集合中的元素进行遍历,如果某个方法只支持Iterator,不支持Enumeration,那么就可以在这里定义一个适配器,来进行中间转换。

      具体代码如下

    定义一个Enumeration2Iterator的类用来将Enumeration转换成Iterator。
     1 /**
     2  * Enumeration 到 Iterator的适配器
     3  * @author Apache_xiaochao
     4  *
     5  * @param <E>
     6  */
     7 public class Enumeration2Iterator<E> implements Iterator<E> {
     8     
     9     private Enumeration<E> enumeration;
    10     
    11     public Enumeration2Iterator(Enumeration<E> enumeration) {
    12         super();
    13         this.enumeration = enumeration;
    14     }
    15 
    16     @Override
    17     public boolean hasNext() {
    18         return enumeration.hasMoreElements();
    19     }
    20 
    21     @Override
    22     public E next() {
    23         return enumeration.nextElement();
    24     }
    25 
    26     @Override
    27     public void remove() {
    28         //不支持此操作,所以用异常来通知用户
    29         throw new UnsupportedOperationException();        
    30     }
    31 
    32 }

    测试代码如下:

     1 public class Driver {
     2     
     3     /**
     4      * 遍历打印集合元素的方法
     5      * @param iterator
     6      */
     7     public<E> void iterate(Iterator<E> iterator){
     8         while(iterator.hasNext()){
     9             System.out.println(iterator.next());
    10         }
    11     }
    12 
    13     public static void main(String[] args) {
    14         
    15         Driver driver = new Driver();
    16         Vector<String> vector = new Vector<>();
    17         vector.add("a");
    18         vector.add("b");
    19         vector.add("c");
    20         //这里我们假设Vector不支持iterators()方法
    21         //driver.iterate(vector.elements());  //因为iterate方法不支持Enumeration,只支持Iterator,所以这里需要一个适配器进行转换
    22         driver.iterate(new Enumeration2Iterator<>(vector.elements()));        
    23     }
    24 
    25 }
    适配器模式有两种:
    • “对象”适配器,上面讲的就是这种适配器
    • “类”适配器,这个需要多重继承才能实现,大致的实现是让适配器去继承被适配的类(比如上例的Iterator)和希望适配的类(比如上例中的Enumeration)
    一个适配器可以同时适配多个接口,并不一定非得适配一个接口。
    当需要使用一个现有的类而其接口并不符合你的需求的时候,就使用适配器模式。
    装饰者模式与适配器模式的区别:
    • 适配器是用来将一个接口转换成另一个接口的中间件
    • 装饰者模式是通过组合的思想来增强某一个对象的能力

  • 相关阅读:
    Linux设备模型 学习总结
    平衡二叉树
    数字在排序数组中出现的次数
    两个链表的第一个公共节点
    第一个只出现一次的字符
    丑数
    把数组排成最小的数
    剑指offer 连续子数组的最大和
    查找描述信息中包括robot的电影对应的分类名称以及电影数目,而且还需要该分类对应电影数量>=5部
    for each
  • 原文地址:https://www.cnblogs.com/xiaochao-cs-whu/p/3983190.html
Copyright © 2011-2022 走看看