适配器模式

定义

将一个类的接口转换成客户期望的另一个接口
使原本接口不兼容的类可以一起工作

类型

结构型

适用场景

  • 已经存在的类,它的方法和需求不匹配时(方法结果相同或相似)
  • 不是软件设计阶段考虑的设计模式,是随着软件维护,由于不同产产品、不同厂家造成功能类似而接口不相同情况下的解决方案。

优点

  • 能提高类的透明性和复用,现有的类复用但不需要改变
  • 目标类和适配器类解耦,提高程序扩展性
  • 符合开闭原则

缺点

  • 适配器编写过程需要全面考虑,可能会增加系统的复杂性
  • 增加系统代码可读的难度

扩展

  • 对象适配器

    符合组合复用原则,使用委托机制

  • 类适配器

    通过类继承

相关设计模式

  • 适配器模式和外观模式

    都是对现有的类,现有的系统的封装,外观模式定义了新的接口,而适配器则是复用了一个原有的接口,适配器是使原有的接口协同工作,而外观则是在现有的系统中提供一个更为方便的访问入口,两者最大的区别就是适配的力度不同,外观模式用来适配整个子系统,适配器只适配接口。

  • 装饰者模式和适配器模式

    两者都可以被称为包装模式,装饰者模式中装饰者和被装饰者可以实现相同的接口,或者装饰者是被装饰者的子类。适配器模式中适配器和被适配的类具有不同的接口,可能会有部分的接口是重合的。

代码

类适配器模式

public class Adaptee {
    public void adapteeRequest(){
        System.out.println("被适配者的方法");
    }
}

目标接口

public interface Target {
    void request();
}
public class ConcreteTarget implements Target {
    @Override
    public void request() {
        System.out.println("ConcreteTarget 目标方法");
    }
}

适配器

public class Adapter extends Adaptee implements Target {
    @Override
    public void request() {
        super.adapteeRequest();
    }
}

测试

public class Test {
    public static void main(String[] args) {
        Target target = new ConcreteTarget();
        target.request();

        Target adapterTarget = new Adapter();
        adapterTarget.request();
    }
}

结果

ConcreteTarget 目标方法
被适配者的方法

UML

Adapter继承了被适配者,同时实现了目标接口
而Target有两种实现,一种使具体的ConcreteTarget实现类,一种通过Adapter变成了Adaptee的实现类

对象适配器
修改Adapter

public class Adapter implements Target {

    private Adaptee adapter = new Adaptee();

    @Override
    public void request() {
        adapter.adapteeRequest();
    }
}

结果

ConcreteTarget 目标方法
被适配者的方法

UML

Adapter 和adapter是组合关系,都作为Target的实现类

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注