适配器模式

1.模式动机与定义

模式动机

在适配器模式中可以定义一个包装类,包装不兼容接口的对象,这个包装类指的就是适配器(Adapter),它所包装的对象就是适配者(Adaptee),即被适配的类。

适配器提供客户类需要的接口,适配器的实现就是把客户类的请求转化为对适配者的相应接口的调用。也就是说:当客户类调用适配器的方法时,在适配器类的内部将调用适配者类的方法,而这个过程对客户类是透明的客户类并不直接访问适配者类。因此,适配器可以使由于接口不兼容而不能交互的类可以一起工作。这就是适配器模式的模式动机。

模式定义

适配器模式(Adapter Pattern):将一个接口转换成客户希望的另一个接口适配器模式使接口不兼容的那些类可以一起工作

适配器模式既可以作为类结构型模式,也可以作为对象结构型模式

定义中所提及的接口是指广义的接口,它可以表示一个方法或者方法的集合

2.模式结构与分析

模式结构

适配器模式包含如下角色

  1. Target:目标抽象类:定义客户要用的特定领域的接口,可以是抽象类或接口,或者具体类。在类适配器中,由于Java语句不支持多重继承,只能是接口。
  2. Adapter:适配器类:可以调用另一个接口,作为一个转换器,对适配者类以及目标抽象类进行适配。适配器是适配器模式的核心
  3. Adaptee:适配者类:适配者即配适配的角色,定义了一个已经存在的接口,其需要适配。一般是一个具体类,包含了客户希望使用的业务方法,在某些情况下甚至没有适配者类的源代码
  4. Client:客户类:在客户类中针对目标抽象类进行编程,调用在目标抽象类中定义的业务方法。

模式分析

//典型的类适配器示例代码
public class Adapter extends Adaptee implements Target{
    public void request(){
        superspecificRequest();
    }
}

//典型的对象适配器示例代码
public class Adapter extends Target{
    private Adaptee adaptee;
    
    public Adapter(Adaptee adaptee){
        this.adaptee=adaptee;
    }
    
    public void request(){
        adaptee.specificRequest();//转发调用
    }
}

3.模式效果与应用

优点

  1. 目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类无须修改原有结构
  2. 增加了类的透明性和复用性,提高了适配者的复用性,同一个适配者类可以在多个不同的系统中复用
  3. 灵活性和扩展性非常好
  4. 类适配器模式:置换一些适配者的方法很方便
  5. 对象适配器模式:可以把多个不同的适配者适配到同一个目标,还可以适配一个适配者的子类

缺点

类适配器模式:
(1)一次最多只能适配一个适配者类,不能同时适配多个适配者
(2)适配者类不能为最终类
(3)目标抽象类只能为接口,不能为类

对象适配器模式:在适配器中置换适配者类的某些方法比较麻烦

使用情况

  1. 系统需要使用一些现有的类,而这些类的接口不符合系统的需要,甚至没有这些类的源代码
  2. 创建一个可以重复使用的类,用于和一些彼此之间没有太大关联的类,包括一些可能在将来引进的类一起工作

模式应用

Sun公司在1996年公开了Java语言的数据库连接工具JDBC,JDBC使得Java语言程序能够与数据库连接,并使用SQL语言来查询和操作数据。JDBC给出一个客户端通用的抽象接口,每一个具体数据库引擎(如SQLServer、0racle、MySQL等)的JDBC驱动软件都是一个介于JDBC接口和数据库引擎接口之间的适配器软件。抽象的JDBC接口和各个数据库引擎API之间都需要相应的适配器软件,这就是为各个不同数据库引擎准备的驱动程序。

在Spring AOP框架中,对BeforeAdvice.AfterAdvice、ThrowsAdvice三种通知类型借助适配器模式来实现。

public interface AdvisorAdapter{
    //将一个Advisor适配成MethodInterceptor
    MethodInterceptor getInterceptor(Advisor advisor);
    //判断此适配器是否支持特定的Advice
    boolean supportsAdvice(Advice advice);
}
posted @ 2025-12-29 23:02  QixunQiu  阅读(15)  评论(0)    收藏  举报