ADAPTER(适配器)– 类对象结构型模式

  1. 意图:
    将一个类的接口转换成客户希望的另外一个接口。
    Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

  2. 别名:
    包装器(Wrapper)。

  3. 动机:

  4. 适用性:
    a. 你想使用一个已经存在的类,而它的接口不符合你的需求。
    b. 你想创建一个可以复用的类,该类可以与其他不相关的类或者不可预见的类(即那些接口可能不一定兼容的类)协同工作。
    c. (仅适用于对象Adapter)你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。

  5. 结构:
    a. 类适配器使用多重继承对一个接口与另一个接口进行匹配,如下图所示:
    适配器模式结构图1

    b. 对象匹配器依赖对象组合,如下图所示:
    适配器模式结构图2

  6. 参与者:
    a. Target: 定义Client使用的与特定领域相关的接口。
    b. Client: 与符合Target接口的对象协同。
    c. Adaptee: 定义一个已经存在的接口,这个接口需要适配。
    d. Adapter: 对Adaptee的接口与Target接口进行适配。

  7. 协作:
    Client在Adapter实例上调用一些操作。接着适配器调用Adaptee的操作实现这个请求。

  8. 效果:
    a. 用一个具体的Adapter类对Adaptee和Target进行匹配。
    b. 使得Adapter可以重定义Adapter的部分行为,因为Adapter是Adaptee的一个子类。
    c. 仅仅引入了一个对象,并不需要额外的指针以间接得到adaptee
    d. 允许一个Adapter与多个Adaptee
    e. 使得重定义Adaptee的行为比较困难。

    需要考虑的一些其他因素:
    a. Adapter的匹配程度
    b. 可插入的Adapter
    c. 使用双向适配器提供透明操作

  9. 实现:
    a. 使用抽象操作
    b. 使用代理对象
    c. 参数化的适配器

  10. 代码示例:

    /**
    * 如上结构图中的第一种方式
    * 可以在Adapter request中实现具体的适配操作
    */
    public interface Target {
        String request();
    }
    
    public class Adaptee {
        public String specificRequest() {
            return  "This is specific request";
        }
    }
    
    public class Adapter extends Adaptee implements Target {
        @Override
        public String request() {
            return super.specificRequest();
        }
    }
    
    public class Client {
        public static void main(String[] args) {
            Target target = new Adapter();
            System.out.println(target.request());
        }
    }
    
    /**
    * 如上结构图中的第二种方式
    * 其他类不变,这里只是通过组合的方式将Adaptee引入
    * 同样可以在Adapter request中实现具体的适配操作
    */
    public class Adapter implements Target {
    
        private static final Adaptee adaptee = new Adaptee();
    
        @Override
        public String request() {
            return adaptee.specificRequest();
        }
    }
    
    
  11. 已知应用:

  12. 相关模式: