设计模式-适配器模式

设计模式专栏

    • 模式介绍
    • 模式特点
    • 应用场景
    • 适配器类型
    • 代码示例
      • Java实现适配器模式
      • python实现适配器模式
    • 适配器模式在spring中的应用


模式介绍

适配器模式是一种结构型设计模式,它的作用是将一个类的接口转换成客户端希望的另一个接口。适配器模式可以让原本不兼容的接口之间进行协作,从而让这些接口能够一起工作。

适配器模式包含以下角色:

  1. 目标抽象类:Target,该角色把其他类转换为我们期望的接口,可以是一个抽象类或接口,也可以是具体类。定义Client使用的与特定领域相关的接口。
  2. 被适配者:Adaptee,原有的接口,也是希望被适配的接口。定义一个已经存在的接口,这个接口需要适配,需要适配别人(要适配者)。
  3. 适配器:Adapter,将被适配者和目标抽象类组合到一起的类。对Adaptee的接口与Target接口进行适配。

适配器模式的应用场景:

  1. 系统需要使用现有的类,而此类的接口不符合需要。
  2. 需要一个统一的输出接口,而输入类型不可预知。
  3. 创建一个可以复用的类,使得该类可以与其他不相关的类或不可预见的类协同工作。

在使用适配器模式时,应该注意保持接口的一致性和简洁性,从而让代码更加易于维护和扩展。

在这里插入图片描述

模式特点

适配器模式的特点主要包括:

  1. 适配器模式是一种结构型设计模式,它通过引入一个适配器类来将不兼容的接口转换为客户端期望的接口,从而实现两个不兼容的类一起工作。
  2. 适配器模式可以让任何两个没有关联的类一起运行,从而提高类的复用性,增加类的透明度,提高系统的灵活性。
  3. 适配器模式可以将目标类和适配类解耦,通过引入一个适配器类重用现有的适配者类,而无需修改原有代码。
  4. 适配器模式可以解决现存类和复用环境要求不一致的问题,通过适配现有的类,提高系统的可维护性和可扩展性。
  5. 适配器模式的使用需要注意保持接口的一致性和简洁性,从而让代码更加易于维护和扩展。
  6. 适配器模式的使用需要谨慎,如果过度使用适配器,会让系统变得非常零乱,不易整体进行把握。
  • 适配器模式的优点主要包括:
  1. 提高类的透明性和复用,现有的类复用但不需要改变。
  2. 目标类和适配器类解耦,提高程序的扩展性。
  3. 在很多业务场景中符合开闭原则。
  • 适配器模式的缺点主要包括:
  1. 适配器编写过程需要全面考虑,可能会增加系统的复杂性。
  2. 增加代码阅读难度,降低代码可读性,过多使用适配器会使系统代码变得凌乱。

在这里插入图片描述

应用场景

适配器模式的应用场景非常广泛。以下是其中几个常见的应用场景:

  1. 不同接口之间的转换:有时候,我们可能会遇到两个不同的接口,它们的功能相似,但是接口定义不同。这时,我们可以使用适配器模式来将一个接口转换成另一个接口,从而让这两个接口可以协同工作。
  2. 扩展现有组件的功能:有时候,我们可能需要对现有的组件进行功能扩展,但是这些组件的接口并不支持我们需要的功能。这时,我们可以使用适配器模式来扩展这些组件的接口,从而让它们支持我们需要的功能。
  3. 不同系统之间的集成:当需要将不同的系统集成在一起时,我们可能会遇到不同系统之间的接口不兼容的情况。这时,我们可以使用适配器模式来将一个系统的接口转换成另一个系统的接口,从而让这两个系统可以协同工作。
  4. 不同数据格式之间的转换:有时候,我们可能需要将不同的数据格式进行转换,以便于对这些数据进行进一步的处理。这时,我们可以使用适配器模式来将一个数据格式转换成另一个数据格式,从而让这些数据可以被正确地处理。

适配器模式是一种非常有用的设计模式,它可以让我们在不改变原有接口的前提下,对原有的接口进行扩展和转换,从而让这些接口可以更好地适应新的需求和环境。

在这里插入图片描述

适配器类型

适配器模式主要分为以下三种类型:

  1. 类适配器模式 :这种模式将一个接口转换成客户端期望的另一个接口。例如,假设我们有一个旧的接口,它不能与新的接口一起工作,我们可以创建一个类,将这个旧的接口转换成一个新的接口,从而让它们可以一起工作。
  2. 对象适配器模式 :这种模式也是将一个接口转换成客户端期望的另一个接口。与类适配器模式不同的是,对象适配器模式是通过组合来实现接口转换的。
  3. 接口适配器模式(缺省适配器模式) :这种模式也是将一个接口转换成客户端期望的另一个接口。与类适配器和对象适配器不同的是,接口适配器模式是系统中默认的适配器。

在这里插入图片描述

代码示例

Java实现适配器模式

下面是一个Java语言中适配器模式的简单示例:

//定义一个目标接口
interface Target {
   void request();
}

//定义一个被适配者类
class Adaptee {
   public void specificRequest() {
      System.out.println("Adaptee's specific request.");
   }
}

//定义一个适配器类,适配器类实现目标接口并内部包含被适配者对象
class Adapter implements Target {
   private Adaptee adaptee;
   
   //构造方法,传入被适配者对象
   public Adapter(Adaptee adaptee) {
      this.adaptee = adaptee;
   }
   
   //适配器方法,调用被适配者对象的方法
   public void request() {
      adaptee.specificRequest();
   }
}

//客户端代码,使用目标接口的方法
public class Client {
   public static void main(String[] args) {
      Adaptee adaptee = new Adaptee(); //创建被适配者对象
      Target target = new Adapter(adaptee); //创建适配器,并将被适配者对象传入适配器
      target.request(); //调用目标接口的方法,实际上调用的是被适配者的方法
   }
}

python实现适配器模式

好的,以下是一个Python实现适配器模式的示例:

# 定义一个目标接口
class Target:
    def request(self):
        pass

# 定义一个被适配者类
class Adaptee:
    def specific_request(self):
        print("Adaptee's specific request.")

# 定义一个适配器类,适配器类实现目标接口并内部包含被适配者对象
class Adapter(Target):
    def __init__(self, adaptee):
        self.adaptee = adaptee

    def request(self):
        self.adaptee.specific_request()

# 客户端代码,使用目标接口的方法
if __name__ == '__main__':
    adaptee = Adaptee()  # 创建被适配者对象
    target = Adapter(adaptee)  # 创建适配器,并将被适配者对象传入适配器
    target.request()  # 调用目标接口的方法,实际上调用的是被适配者的方法

在上面的示例中,我们定义了一个目标接口Target,一个被适配者类Adaptee和一个适配器类Adapter。适配器类Adapter实现了目标接口Target并内部包含一个被适配者对象。在客户端代码中,我们首先创建了一个被适配者对象,然后创建了一个适配器对象并将被适配者对象传入适配器对象。最后,我们调用目标接口的方法request(),实际上调用的是被适配者的方法specific_request()

在这里插入图片描述

适配器模式在spring中的应用

适配器模式在Spring框架中有着广泛的应用,其中最典型的例子就是Spring的MyBatis适配器和JPA适配器。

Spring框架通过适配器模式,使得在集成不同的持久层框架时,可以保持代码的低耦合性。在Spring中,持久层框架通常通过DAO(数据访问对象)接口与业务逻辑层进行交互,而不同的持久层框架可能具有不同的API,因此需要一个适配器来转换不同的API。

例如,在使用MyBatis作为持久层框架时,MyBatis没有实现JPA规范的API,因此无法直接与Spring的JPA集成。这时,我们可以使用适配器模式来将MyBatis的API转换为JPA规范的API,从而实现MyBatis和JPA的集成。

适配器模式的优点在于可以将不同的API转换为统一的接口,从而提高代码的可维护性和可扩展性。在Spring框架中,适配器模式的应用不仅限于持久层框架的集成,还可以应用于其他需要转换接口的场景。

在Spring框架中,适配器模式的应用还可以扩展到其他方面。例如,在处理HTTP请求时,不同的HTTP请求方法可能需要不同的处理方式。为了实现这一点,我们可以使用适配器模式来将不同的HTTP请求方法转换为统一的处理方式。

具体来说,我们可以定义一个适配器类,该类实现了HTTP请求处理接口,并将不同的HTTP请求方法转换为统一的处理方式。然后,我们可以在Spring配置文件中定义不同的适配器实现类,用于处理不同的HTTP请求方法。在处理HTTP请求时,我们只需要调用适配器的处理方法即可,而不需要关心具体的HTTP请求方法。

通过适配器模式的应用,我们可以将不同的HTTP请求方法转换为统一的处理方式,从而提高代码的可维护性和可扩展性。同时,适配器的使用还可以使得代码更加灵活和可扩展,可以轻松地添加新的适配器实现类来处理新的HTTP请求方法。

在这里插入图片描述

设计模式-原型模式

设计模式-建造者模式

设计模式-工厂模式

设计模式-单例模式

你可能感兴趣的:(设计模式,开发周边,设计模式,适配器模式,java)