设计模式(七)适配器模式

总章目录,设计模式(一)基本介绍

一、定义

适配器模式:将一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法一起工作的两个类能够在一起工作。
适配器:类适配器、对象适配器

二、类适配器

类适配器模式是把适配的类的API转换成为目标类的API,UML如下图所示:
客户端(Client):客户只会看到目标接口
目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。
适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。
适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者


Target:

public interface Target {
    void Request();
}

Adaptee适配者:

public class Adaptee {
    public void SpecificRequest(){
        System.out.println("适配者接口!");
    }
}

Adapter适配器

public class Adapter extends Adaptee implements Target {

    @Override
    public void Request() {
        this.SpecificRequest();
    }
}

我们注意到Adaptee 中没有Request()方法,因此我们使用补充适配器这个方法。

public class Client {
    public static void main(String[] args){

        Target target = new Adapter();
        target.Request();
    }
}

输出:
适配者接口!

三、对象适配器

对象适配器与类的适配器模式相同,对象的适配器模式把适配的类的API转换成为目标类的API。


public interface Target {
    void Request();
}

public class Adaptee {
    public void SpecificRequest(){
        System.out.println("适配者接口!");
    }
}
public class Adapter implements Target  {
    // 直接关联被适配类
    private Adaptee adaptee;

    // 可以通过构造函数传入具体需要适配的被适配类对象
    public Adapter (Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    @Override
    public void Request() {
        // 这里是使用委托的方式完成特殊功能
        this.adaptee.SpecificRequest();
    }
}
public class Client {
    public static void main(String[] args){

        Target target = new Adapter(new Adaptee());
        target.Request();
    }
}

四、总结

名称 优点 缺点
类适配器 复用性好,客户端可以调用同一接口,耦合性低。 高耦合,灵活性低
对象适配器 灵活性高、低耦合 需要引入对象实例

通常我们会使用对象适配器模式,避免使用继承。